2013-03-12 2 views
1

이미지의 특정 좌표 너비와 높이를 가진 사각형을 만들고 싶습니다.open cv, 직사각형 참조 영역 참조

그런 다음 채널을 분할하고 마지막으로이 영역에서 주어진 채널을 thresholding합니다.

내 문제는 이미지의 영역 (직사각형)을 참조하고 싶습니다.

이것은 내 코드입니다. cv :: Rect myROI (10, 20, 50, 50);
cv :: Mat croppedImage = org_image (myROI);

이 croppedImage를 조작 한 후에도 org_image에 영향을주었습니다.

지역을 참조하고 해당 지역을 복사하지 않으려합니다 (참조).

어떻게하면됩니까? 편집 한


:

는 우선 답변에 감사드립니다. 내가 사용하는 위의 내 코드에 작은 솔루션이 필요합니다
cv :: threshold (croppedImage, croppedImage, thresh, 255, type);

직사각형 영역은 임계 값이지만 (모든 채널), 원하는 특정 채널이 아닙니다. 예를 들어 파란색 채널 만 임계 값을 지정하려는 경우, 모든 것을 시도했지만 작동하지 않습니다.

사각형을 나눠 보았지만 작동하지 않았습니다.

그런데 분할 된 이미지를 병합하는 솔루션이 있습니까? 이것은 나를 도울 수 경우에만 croppedImage 참조하여 분할 할 수 내 생각은 내 생각을 해결할 것입니다.

그래서 나는 단지 하나의 채널을 필요로합니다. 완전한 솔루션을 제공해주세요. 그리고 저는 나누기를 사용해야합니다.

감사합니다


편집 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]); 

아웃풋 :이 croppedImage에서 작동 후

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

하지 않는 한 당신이 명시 적으로'클론()의''이력서 :: Mat', 메모리가 공유됩니다. ROI에 대한 작업을 수행하면 원래 이미지에 영향을 주어야합니다. 당신의 코드가 이미 이것을하지 않는다고 말하는 것입니까? – Aurelius

답변

1

는, 그 작업은 org_image에 영향을 미칠 것 .이 특별한 생성자를 사용할 수 있습니다

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; 

출력 :

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

은 예입니다

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]