2014-10-27 129 views
1

我有一個3層cv :: mat,我想在第一層和最後一層之間切換。 有些事情是這樣的:(MATLAB風格)如何在C++中翻轉cv :: mat?

cv::mat mt = image; 
mt = [mt[:,:,3],mt[:,:,2],mt[:,:,1]]; 
+0

層=通道/尺寸?使用cv :: split – Micka 2014-10-27 18:09:54

+0

你能給出一個完整的答案嗎?我不明白 – ifryed 2014-10-27 18:13:56

+0

http://docs.opencv.org/modules/core/doc/operations_on_arrays.html#split – Micka 2014-10-27 18:34:43

回答

2

更多拋光ifryed的解決方案:

#include <algorithm> 

cv::Mat im = getImage(); 
std::vector<cv::Mat> img_rgb; 
cv::split(im,img_rgb); 
std::iter_swap(img_rgb, img_rgb+2); 
cv::merge(img_rgb,im); 
1
 cv::Mat im = getImage(); 
     cv::Mat tmp = cv::Mat::zeros(cv::Size(im.rows,im.cols),CV_8UC1); 
     std::vector<cv::Mat> img_rgb; 
     cv::split(im,img_rgb); 

     img_rgb[0].copyTo(tmp); 
     img_rgb[2].copyTo(img_rgb[0]); 
     tmp.copyTo(img_rgb[2]); 
     cv::merge(img_rgb,im); 
+1

這應該工作!但我認爲你不必使用copyTo()。由於我們不需要複製圖像內容,它們的頭部就足夠了,所以簡單的分配就可以實現這一點。分裂後,只需做tmp = img_rgb [0]; img_rgb [0] = img_rgb [2]; img_rgb [2] = tmp; 。另外,我認爲使用的iter_swap(img_rgb,img_rgb + 2)會很好 – marol 2014-10-27 19:20:27