2014-12-04 65 views
2

我遇到問題。我有一個形象。然後我必須將圖像分成兩個相等的部分。我做了這個像(編譯代碼,一切都很好):將兩個Mat圖像合併爲一個

Mat image_temp1 = image(Rect(0, 0, image.cols, image.rows/2)).clone(); 
Mat image_temp2 = image(Rect(0, image.rows/2, image.cols, image.rows/2)).clone(); 

然後,我必須獨立地改變每個部分,最後合併成一個。我不知道如何正確地做到這一點。我應該如何將這兩部分圖像合併成一個圖像?
實施例:http://i.stack.imgur.com/CLDK7.jpg

回答

6

有幾種方式做到這一點,但我發現最好的方法是使用cv::hconcat(mat1, mat2, dst)爲水平合併或cv::vconcat(mat1, mat2, dst)垂直。

不要忘記照顧空矩陣合併案!

+2

哇!我無法相信這些功能在文檔中不存在。 – brotherofken 2014-12-04 17:14:14

3

似乎cv::Mat::push_back正是你尋找:

C++:空隙墊::的push_back(常量墊&米):添加元素的矩陣的底部。

Parameters:  
    m – Added line(s). 

該方法將一個或多個元素添加到矩陣的底部。當元素爲 墊時,其類型和列數必須與容器矩陣中的相同。

或者,您可以創建合適的大小和位置的圖像部分的新cv::Mat直接進去:

Mat image_temp1 = image(Rect(0, 0, image.cols, image.rows/2)).clone(); 
Mat image_temp2 = image(Rect(0, image.rows/2, image.cols, image.rows/2)).clone(); 
... 
cv::Mat result(image.rows, image.cols); 
image_temp1.copyTo(result(Rect(0, 0, image.cols, image.rows/2))); 
image_temp2.copyTo(result(Rect(0, image.rows/2, image.cols, image.rows/2)); 
1

如何:

Mat newImage = image.clone(); 
Mat image_temp1 = newImage(Rect(0, 0, image.cols, image.rows/2)); 
Mat image_temp2 = newImage(Rect(0, image.rows/2, image.cols, image.rows/2)); 

由於不使用clone()創建臨時圖片,你修改隱時newImage修改臨時圖像,而不需要再次合併。在改變image_temp1image_temp2之後,newImage將與您拆分,修改併合並子圖像完全相同。