我在装有红外灯的玻璃杯下有一个摄像头来检测物体。我可以使用以下代码找到轮廓并绘制轮廓(我刚刚在网上找到了一些示例,并根据需要对其进行了修改,因此我根本不是一个大师!)。
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,但是裁剪是一个矩形,而我(例如)可以检测到物体,即恰好在最左边的区域。
我认为轮廓中应该有一些数据可以告诉我像素在哪里,但是我还不能弄清楚……