2013-03-12 73 views
1

我想從圖像創建一個具有特定座標寬度和高度的矩形。打開簡歷,矩形感興趣的區域

然後分割通道,最後對給定通道進行閾值分割。

我的問題是我想引用圖像上的區域(矩形)。

這是我的代碼: CV ::矩形myROI(10,20,50,50);
cv :: Mat croppedImage = org_image(myROI);

後,我對這個croppedImage我還想工作,也就是說在org_image的操作效果。

我想referece該地區,並不能複製的區域(引用它)。

我該怎麼做?


編輯1:

感謝您的回答首先的。當我使用
cv :: threshold(croppedImage,croppedImage,thresh,255,type)時,我需要一個額外的小解決方案。

的矩形區域被閾值(但所有通道),但不是我想要的特定頻道,例如我想只有藍色通道被閾值,我嘗試了一切,它不工作。

我試過分割矩形,但它不起作用。

順便說一下,解決方案也合併拆分圖像嗎?這可以幫助我 如果我可以通過只引用裁剪圖像拆分它會解決我的問題,我想。

所以我只需要門檻的投資回報率一個通道,請給我一個完整的解決方案。我必須使用分裂。

謝謝


編輯2

所以不工作,看到分裂渠道不必須裁剪後的圖像,並分別有什麼影響我的代碼在這裏... 操作原始圖像也是。

Mat org_image = image.clone(); 
    cv::Rect myROI(0, 0, 5, 5); 
    cv::Mat croppedImage = org_image(myROI); 
    std::vector<cv::Mat> img_split(3); 
    split(croppedImage, img_split); 

    cv::threshold(img_split[1], img_split[1], thresh, 255, 0); 

    for(int i=0; i < 3; i++) 
    printf("img_split[%d].data[0] ==> adress: %p, ==> data: %d\n", i, &img_split[i].data[0], img_split[i].data[0]); 
    printf("+++++++++++++++++\n");   
    for(int i=0; i < 3; i++) 
    printf("  croppedImage[%d] ==> adress: %p, ==> data: %d\n", i, &croppedImage.data[i], croppedImage.data[i]);  
    printf("+++++++++++++++++\n");  
    for(int i=0; i < 3; i++) 
    printf("org_image[%d] ==> adress: %p, data -> %d\n", i, &org_image.data[i], org_image.data[i]); 

輸出:

img_split[0].data[0] ==> adress: 0x846e8a0, ==> data: 212 
img_split[1].data[0] ==> adress: 0x846e8d0, ==> data: 255 
img_split[2].data[0] ==> adress: 0x846e910, ==> data: 220 
+++++++++++++++++ 
    croppedImage[0] ==> adress: 0xb468d010, ==> data: 212 
    croppedImage[1] ==> adress: 0xb468d011, ==> data: 220 
    croppedImage[2] ==> adress: 0xb468d012, ==> data: 220 
+++++++++++++++++ 
org_image[0] ==> adress: 0xb468d010, data -> 212 
org_image[1] ==> adress: 0xb468d011, data -> 220 
org_image[2] ==> adress: 0xb468d012, data -> 220 

我沒有任何更多的想法.... :-(

+0

除非你明確地'克隆()''一個CV :: Mat',內存是共享的。對您的ROI執行操作應該會影響原始圖像。你是說你的代碼已經不這樣做了嗎? – Aurelius 2013-03-12 21:03:28

回答

1

其實,你對這個croppedImage操作之後的操作不會對org_image影響。你可以使用特殊的構造爲這樣:

Mat::Mat(const Mat& m, const Rect& roi) 

這裏是例子:

uchar vals[] = {1,1,1,1, 
       1,1,1,1, 
       1,1,1,1, 
       1,1,1,1}; 
cv::Mat_<uchar> A(4,4,vals); 
std::cout << "before:\n" << A << std::endl; 

cv::Rect roi(1,1,2,2); 
cv::Mat_<uchar> B(A, roi); 
B.setTo(2); 

std::cout << "after:\n" << A << std::endl; 

輸出:

before: 
[1, 1, 1, 1; 
    1, 1, 1, 1; 
    1, 1, 1, 1; 
    1, 1, 1, 1] 
after: 
[1, 1, 1, 1; 
    1, 2, 2, 1; 
    1, 2, 2, 1; 
    1, 1, 1, 1]