2013-03-12 7 views
1

Я хочу создать прямоугольник с конкретными координатами ширины и высоты от изображения.open cv, прямоугольная область интереса ссылка

А затем разделить каналы и, наконец, на порог данного канала в этой области.

Моя проблема в том, что я хочу ссылаться на область (прямоугольник) на изображении.

это мой код: cv :: Rect myROI (10, 20, 50, 50);
cv :: Mat croppedImage = org_image (myROI);

после того, как я оперирую этот обрезанный объект. Я также хочу, чтобы операция воздействовала на org_image.

Я хочу обратиться в этот район и не скопировать область (ссылку).

Как я могу это сделать?


редактировать 1:

спасибо за ваш ответ в первую очередь. Мне нужно небольшое решение в дополнение к моему коду выше, когда я использую
cv :: threshold (croppedImage, croppedImage, thresh, 255, type);

прямоугольная область является пороговым (но все каналы), но не конкретным каналом, который я хотел, например, я хочу, чтобы был установлен только синий канал, я все пробовал, он не работает.

Я попытался разделить прямоугольник, но он не работает.

Кстати, это решение для слияния разделенного изображения тоже? Это могло бы помочь мне Если бы я мог разделить, ссылаясь только на croppedImage, это решит мою проблему, я думаю.

Так что мне нужно только порог одного канала в роу, пожалуйста, дайте мне полное решение. И я должен использовать расщепление.

Спасибо


Edit 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

Если только вы явно 'клон()' 'резюме :: Mat', память разделяется. Выполнение операций с ROI должно влиять на исходное изображение. Вы говорите, что ваш код этого не делает? – Aurelius

ответ

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] 

 Смежные вопросы

  • Нет связанных вопросов^_^