这个问题让我烦恼了两个多星期。
我的目标是分析存放在货架上的纸箱中的一组产品。
现在,我尝试使用OpenCV Python模块中的以下方法:findContours, canny,HoughLines,cv2.HoughLinesP
,但我找不到结果网格。
我的目标是检查产品是否已装满纸箱。
我的第一步是使用结束转换:
closing = cv2.morphologyEx(开启,cv2.MORPH_CLOSE,内核,迭代= 1)]
这给了我轮廓(我没有足够的声望发布这个网址,这个图像与下面的最后一张图片类似,但是没有红线!)。
请给我提示,非常感谢!
答案 0 :(得分:0)
我已经对输入进行了一些操作,并找到了一种方法,在对Hue通道进行阈值处理后,基本上用HoughLinesP
提取网格。
编辑:我正在使用C ++,但我认为类似的python方法应该可用。
cv::Mat image = cv::imread("box1.png");
cv::Mat output; image.copyTo(output);
cv::Mat hsv;
cv::cvtColor(image, hsv, CV_BGR2HSV);
std::vector<cv::Mat> hsv_channels;
cv::split(hsv, hsv_channels);
// thresholding here is a little sloppy, maybe you have to use some smarter way
cv::Mat h_thres = hsv_channels[0] < 50;
// unfortunately, HoughLinesP couldnt detect all the lines if they were too wide
// to make this part more robust I would suggest a ridge detection on the distance transformed image instead of 'some erodes after a dilate'
cv::dilate(h_thres, h_thres, cv::Mat());
cv::erode(h_thres, h_thres, cv::Mat());
cv::erode(h_thres, h_thres, cv::Mat());
cv::erode(h_thres, h_thres, cv::Mat());
std::vector<cv::Vec4i> lines;
cv::HoughLinesP( h_thres, lines, 1, CV_PI/(4*180.0), 50, image.cols/4, 10 );
for( size_t i = 0; i < lines.size(); i++ )
{
cv::line( output, cv::Point(lines[i][0], lines[i][1]),
cv::Point(lines[i][2], lines[i][3]), cv::Scalar(155,255,155), 1, 8 );
}
这是图像:
hsv转换后的
threshholded hue channel:
输出:
也许其他人知道如何在没有那些侵蚀步骤的情况下改进HoughLinesP ......
希望这种方法对您有所帮助,您可以进一步改进它以满足您的需求。