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

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

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

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

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

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

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

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


редактировать 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

идей больше нет... :-(


person user1844505    schedule 12.03.2013    source источник
comment
Если вы явно не clone() a cv::Mat, память является общей. Выполнение операций с ROI должно повлиять на исходное изображение. Вы говорите, что ваш код еще не делает этого?   -  person Aurelius    schedule 13.03.2013


Ответы (1)


На самом деле, после того, как вы поработаете с этим обрезанным изображением, эта операция повлияет на изображение 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]
person Alexander Gorban    schedule 12.03.2013