Opencv 打开cv,感兴趣的矩形区域引用

Opencv 打开cv,感兴趣的矩形区域引用,opencv,reference,area,threshold,roi,Opencv,Reference,Area,Threshold,Roi,我想从图像中创建一个具有特定坐标宽度和高度的矩形 然后分割通道,最后在该区域对给定通道进行阈值化 我的问题是我想引用图像上的一个区域(矩形) 这是我的代码: cv::Rect myROI(10,20,50,50) cv::Mat croppedImage=组织图像(myROI) 在我对这个裁剪图像进行操作之后,我还想知道操作对组织图像的影响 我想引用该区域,而不是复制该区域(引用它) 我该怎么做 编辑1: 首先谢谢你的回答。当我使用 cv::阈值(croppedImage,croppedIma

我想从图像中创建一个具有特定坐标宽度和高度的矩形

然后分割通道,最后在该区域对给定通道进行阈值化

我的问题是我想引用图像上的一个区域(矩形)

这是我的代码: cv::Rect myROI(10,20,50,50)
cv::Mat croppedImage=组织图像(myROI)

在我对这个裁剪图像进行操作之后,我还想知道操作对组织图像的影响

我想引用该区域,而不是复制该区域(引用它)

我该怎么做


编辑1:

首先谢谢你的回答。当我使用
cv::阈值(croppedImage,croppedImage,thresh,255,类型)

矩形区域是阈值化的(但所有通道),但不是我想要的特定通道,例如,我只想对蓝色通道进行阈值化,我尝试了所有方法,但都不起作用

我试着分割矩形,但不起作用

顺便问一下,这也是合并分割图像的解决方案吗?这对我有帮助 如果我可以通过引用croppedImage进行拆分,我想这会解决我的问题

所以我只需要在roi中设置一个通道的阈值,请给我一个完整的解决方案。我必须使用拆分。

多谢各位


编辑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]);

我没有更多的想法-(

实际上,在您对该裁剪图像进行操作后,该操作将对组织图像产生影响。您可以为此使用特殊构造函数:

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;

实际上,在您对该裁剪图像进行操作后,该操作将对组织图像产生影响。您可以为此使用特殊构造函数:

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;

除非您明确地
clone()
a
cv::Mat
,否则内存是共享的。对ROI执行操作会影响原始图像。您是说您的代码还没有这样做吗?除非您明确地
clone()
a
cv::Mat
,内存是共享的。对ROI执行操作会影响原始图像。你是说你的代码还没有这样做吗?