opencv:请帮我查一下纸箱网格

时间:2014-01-24 06:39:32

标签: opencv

这个问题让我烦恼了两个多星期。

我的目标是分析存放在货架上的纸箱中的一组产品。

现在,我尝试使用OpenCV Python模块中的以下方法:findContours, canny,HoughLines,cv2.HoughLinesP,但我找不到结果网格。 我的目标是检查产品是否已装满纸箱。

  1. 以下是原始图片:http://postimg.org/image/hyz1jpd7p/7a4dd87c/
  2. 我的第一步是使用结束转换:

    closing = cv2.morphologyEx(开启,cv2.MORPH_CLOSE,内核,迭代= 1)]

  3. 这给了我轮廓(我没有足够的声望发布这个网址,这个图像与下面的最后一张图片类似,但是没有红线!)。

    1. 最后,问题是,我怎样才能找到纸箱网格(即其中的产品一个接一个)。 我在下面的图片中添加了红线。
    2. 请给我提示,非常感谢!

      红线:http://postimg.org/image/6i0di4gsx/

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转换后的 hue通道:

enter image description here

threshholded hue channel:

enter image description here

输出:

enter image description here

也许其他人知道如何在没有那些侵蚀步骤的情况下改进HoughLinesP ......

希望这种方法对您有所帮助,您可以进一步改进它以满足您的需求。