OpenCV - 在cvtColor之后使用ROI
OpenCV - Using ROI after a cvtColor
我正在图像中进行一些椭圆识别,为此,我打开了一个简单的图像:
img = imread("M:/Desktop/PsEyeRight.jpg", CV_LOAD_IMAGE_COLOR);
选择一个ROI(这是我在OpenCV 2.4.6中看到设置ROI的唯一方法,其中旧库有一个cvSetImageROI()和cvResetImageROI(),我认为它们更简单):
Mat roi(img, Rect(Point(205, 72), Point(419,285)));
使用 cvtColor 更改其颜色空间:
cvtColor(roi, roi, CV_BGR2GRAY);
应用阈值:
threshold(roi, roi, 150, 255, THRESH_BINARY);
然后我使用克隆的图像执行 findContours,因为 findContours 修改了函数中传递的图像,然后将 ROI 更改回 BGR 颜色空间:
cvtColor(roi, roi, CV_GRAY2BGR);
并在 roi 中绘制所有找到的省略号。
当我显示 roi 时,我可以看到一切都工作了 100%,但我期望当我显示原始图像时,它将是具有阈值 ROI 和其中图纸的原始图像,但相反,我只是得到原始图像本身,就像什么都没有改变一样。我相信这种情况正在发生,因为 cvtColor 正在复制 roi,所以它不再"指向"img。
执行相同的处理并在原始图像中具有ROI的最佳方法(或推荐)是什么,以显示算法的进度?
主要问题是,你不能有一个图像,它部分是3chan/RGB,部分是1chan/gray。
我的解决方案是,首先处理ROI的副本,然后将其转换回RGB并将其粘贴到原始图像中。
img = imread("M:/Desktop/PsEyeRight.jpg", CV_LOAD_IMAGE_COLOR); // original
Mat roi(img, Rect(Point(205, 72), Point(419,285)));
Mat work = roi.clone();
cvtColor(work , work , CV_BGR2GRAY);
threshold(work , work , 150, 255, THRESH_BINARY);
// findContours(work,...);
cvtColor(work , roi, CV_GRAY2BGR); //here's the trick
相关文章:
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 在类定义之后定义一个私有方法
- 在循环C++中指定字符串之后,不会打印该字符串
- C++宏忽略之后的内容
- 要与"if constexpr"一起使用的编译时消息(在预处理器之后)
- strncpy之后的char数组的错误行为
- 计算十进制 c++ 之后的数字
- "x += x--"之后的 x 是什么?
- 类的前向声明之后的类成员函数定义,在类声明之前
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- execlp() 在 fork() 之后无法正常工作
- 我认为我的代码很好,但它在 cin a 之后停止并且没有进一步?
- 如何在MISRA C++之后实施CRTP
- 在 OpenCV 的 namedWindow 之前或之后初始化 Tesseract
- 检测到堆损坏:在正常块 c++ 动态 2D 数组之后
- C++ 如果在 if 为 true 之后运行,为什么还会这样做
- 在 fork() 之后,我在我的程序中不断得到相同的 pid
- OpenSSL C API:如何在程序exec()之后恢复TLS连接?
- 了解在返回值之前和之后使用 EAX 的函数调用
- OpenCV - 在cvtColor之后使用ROI