在 OpenCV 中自动检测和裁剪 ROI
Posted
技术标签:
【中文标题】在 OpenCV 中自动检测和裁剪 ROI【英文标题】:Automatically detect and crop ROI in OpenCV 【发布时间】:2013-01-28 05:56:55 【问题描述】:我有这些图片可以相互比较。但是,我认为我可以裁剪出太多的黑色以使比较更有效。
我想做的是裁剪火星。比较时,矩形或圆形可能会产生更好的结果。我担心如果裁剪会导致图像大小不同,比较不会像预期的那样好?如果可能的话,想法如何做和示例代码?提前致谢
更新:尝试使用 cvHoughCircles() 它不会检测到行星:/
【问题讨论】:
这些照片是什么时候拍的?火星即将进入太阳交界,现在日落很深。 阈值,[检测连通分量][1],裁剪图像。完毕。 [1]:***.com/questions/6044119/… 【参考方案1】:尝试使用颜色检测。您需要找到除黑色以外的所有颜色。 Here 和 here 很好地解释了这种方法。
【讨论】:
【参考方案2】:您可以使用cvCvtColor(img,imgGrayScale,CV_BGR2GRAY)
将这些图像转换为灰度图像
然后使用cvThreshold(imgGrayScale,imgThresh,x,255,CV_THRESH_BINARY)
对它们进行阈值处理。在这里,你必须为 x 找到一个好的值(我认为 x=50 是可以的)。
CvMoments *moments = (CvMoments*)malloc(sizeof(CvMoments));
cvMoments(imgThresh, moments, 1);
double moment10 = cvGetSpatialMoment(moments, 1, 0);
double moment01 = cvGetSpatialMoment(moments, 0, 1);
double area = cvGetCentralMoment(moments, 0, 0);
int x = moment10/area;
int y = moment01/area;
现在您知道了 blob 的 (x.y) 坐标。然后您可以使用cvSetImageROI(imgThresh, cvRect(x-10, y-10, x+10, y+10))
裁剪图像。这里我假设这个 blob 的半径小于 10 像素。
所有裁剪后的图像大小相同,白色斑点(行星)正好位于图像的中间。
然后您可以使用标准化互相关比较图像。
【讨论】:
嗨!投资回报率的想法很棒。你会帮我将有界框设置为我的投资回报率吗? docs.opencv.org/doc/tutorials/imgproc/shapedescriptors/… 使用cvSetImageROI
函数很容易设置ROI。但是您可以为单个图像使用 1 个 ROI。【参考方案3】:
这里没有直方图失败的根本原因。我会在做直方图之前将图像转换为灰度,只是为了使数字更易于管理。彩色图像具有 3D 直方图;红色、绿色、蓝色和灰度直方图都是该 3D 直方图的 1D 投影。
【讨论】:
很抱歉,我必须包含不必要的信息。我想做的是在没有黑人的情况下进行比较。以上是关于在 OpenCV 中自动检测和裁剪 ROI的主要内容,如果未能解决你的问题,请参考以下文章