排除或跳过图像角落的争议

我在装有红外灯的玻璃杯下有一个摄像头来检测物体。我可以使用以下代码找到轮廓并绘制轮廓(我刚刚在网上找到了一些示例,并根据需要对其进行了修改,因此我根本不是一个大师!)。

using namespace cv;

cvtColor(mat,mat,COLOR_BGR2GRAY);
blur(mat,Size(3,3));

erode(mat,NULL,Point(-1,-1),2);
dilate(mat,2);
Canny(mat,100,200);

auto contours = std::vector<std::vector<Point>>();
auto hierarchy = std::vector<Vec4i>();
findContours(mat,contours,hierarchy,CV_RETR_TREE,CV_CHAIN_APPROX_SIMPLE,Point(0,0));

Mat drawing = Mat::zeros(mat.size(),CV_8UC3);
for( int i = 0; i< contours.size(); i++ ) {
    Scalar color = Scalar(rng.uniform(0,255),rng.uniform(0,255));
    drawContours(drawing,i,color,2,8,Point());
}

putText(mat,(QString("Blobs: %1").arg(contours.size())).toStdString(),Point(25,175),cv::FONT_HERSHEY_PLAIN,10,CV_RGB(0,2);

此代码可以很好地发现我很满意的轮廓。除了我的红外灯不知何故在图像的角落和底部造成了伪像。

排除或跳过图像角落的争议

您可以看到我已经使用gimp突出显示了在搜索轮廓时要忽略的区域。在灰色阴影下,您会看到我的原始代码将白色像素检测为轮廓。这些区域存在问题,我想将它们从轮廓搜索或轮廓绘图中排除(以较容易的为准!)

我当时想裁剪图像以获得ROI,但是裁剪是一个矩形,而我(例如)可以检测到物体,即恰好在最左边的区域。

我认为轮廓中应该有一些数据可以告诉我像素在哪里,但是我还不能弄清楚……

tsm1010 回答:排除或跳过图像角落的争议

最简单的方法是简单裁剪图像。图像的区域在OpenCV中被称为ROI,代表感兴趣区域。

所以,你可以简单地说

cv::Mat image_roi = image(cv::Rect(x,y,w,h));

这基本上是一个矩形的作物,其左上角为x,y,宽度为w,高度为h

现在,您可能不想缩小图像的大小。下一个最简单的方法是去除伪像,就是将边框设置为0。当然,使用ROI:

image(cv::Rect(x,h)).setTo(cv::Scalar(0,0));

这会将矩形区域设置为黑色。然后,您必须在想要的图像边框上定义4个矩形区域。

请注意,以上所有内容都是基于手动调整和一些实验,并且只要您的系统是静态的,它就可以工作。

本文链接:https://www.f2er.com/3165763.html

大家都在问