我想从图片中创建一个具有特定宽度和高度坐标的矩形。
然后分割通道,最后对该区域的给定通道进行阈值处理。
我的问题是我想引用图像上的一个区域(矩形)。
这是我的代码:cv::Rect myROI(10,20,50,50);cv::Mat croppeimage = org_image(myROI);
在我对这个croppeimage进行操作之后,我还希望这个操作对org_image产生影响。
我想引用区域,而不是复制区域(引用它)。
我该怎么做呢?
编辑1:
首先感谢您的回答。当我使用
时,我需要一个小的解决方案来补充上面的代码cv::threshold(croppedImage, croppedImage, threresh, 255, type);
矩形区域是阈值(但所有通道),但不是我想要的特定通道,例如,我只想要蓝色通道的阈值,我尝试了所有的,它不工作。
我试着分割这个矩形,但是行不通。
顺便问一下,合并分裂图像也是一个解决方案吗?这对我有帮助如果我可以通过只引用croppeimage来分割,我想这将解决我的问题。
所以我只需要在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: %dn", 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: %dn", i, &croppedImage.data[i], croppedImage.data[i]);
printf("+++++++++++++++++n");
for(int i=0; i < 3; i++)
printf("org_image[%d] ==> adress: %p, data -> %dn", 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
我没有更多的想法....: - (
实际上,在对这个croppeimage进行操作之后,该操作将对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]