检测瓶子是否有标签

时间:2013-11-12 14:33:17

标签: opencv computer-vision

enter image description here enter image description here enter image description here我目前正在使用openCv做一些计算机视觉。我有一个标签上的瓶子样品。我试图确定什么时候瓶子上没有标签。 标签是矩形的。

我使用Canny进行了边缘检测。我尝试使用findcountour()来检测瓶子是否有内部轮廓(这将代表矩形标签)。

4 个答案:

答案 0 :(得分:4)

如果您的问题很简单,只需使用矩形缩小图像。

cv::Mat image = imread("image.png");
cv::Rect labelRegion(50, 200, 50, 50);
cv::Mat labelImage = image(labelRegion);

然后将图像区域分解为三个通道。

cv::Mat channels[3];
cv::split(labelImage, channels);

cv::Mat labelImageRed = channels[2];
cv::Mat labelImageGreen = channels[1];
cv::Mat labelImageBlue = channels[0];

然后对这些通道图像中的每一个进行阈值处理,并计算零/非零像素的数量。

I'm not providing code for this part!

如果你没有在图像上贴标签,那么每个频道的值都会大于〜200(你应该检查一下)。如果有标签,那么在计算未标记的像素的零/非零像素时,您会看到不同的结果。

答案 1 :(得分:2)

#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;
int main()
{

    Mat img=imread("c:/data/bottles/1.png");
    Mat gray;
    cvtColor(img,gray,CV_BGR2GRAY);
    resize(gray,gray,Size(50,100));
    Sobel(gray,gray,CV_16SC1,0,1);
    convertScaleAbs(gray,gray);
    if(sum(gray)[0]<130000)
    {       
        cout<<"no label";
    }else{
        cout<<"has label";
    }
    imshow("gray",gray);
    waitKey();
    return 0;
}

答案 2 :(得分:1)

我猜它应该足以看看瓶子上是否有文字存在(如果是,那么它有标签,反之亦然)..你可以查看像THIS这样的项目..这个领域有很多论文;其中一些比较着名的是由斯坦福大学CV小组完成的 - 12 ..

HTH

答案 3 :(得分:1)

guneykayim建议使用图像分割,我觉得这是最简单的方法。我只是添加了一点......

我的建议是将BGR图像转换为YCbCr,然后在Cb和Cr通道中查找值以匹配标签的颜色。这样即使瓶子上的光照条件发生变化,也可以轻松分割出颜色(一个黑暗的瓶子最终会有白色区域显示为深灰色,如果你有灰色标签,这可能会有问题)

这样的东西应该在python中运行:

# Required moduls
import cv2
import numpy

# Convert image to YCrCb
imageYCrCb = cv2.cvtColor(sourceImage,cv2.COLOR_BGR2YCR_CB)

# Constants for finding range of label color in YCrCb
# a, b, c and d need to be defined
min_YCrCb = numpy.array([0,a,b],numpy.uint8) 
max_YCrCb = numpy.array([0,c,d],numpy.uint8)

# Threshold the image to produce blobs that indicate the labeling
labelRegion = cv2.inRange(imageYCrCb,min_YCrCb,max_YCrCb)

# Just in case you are interested in going an extra step
contours, hierarchy = cv2.findContours(labelRegion, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Draw the contour on the source image
for i, c in enumerate(contours):
    area = cv2.contourArea(c)
    if area > minArea: # minArea needs to be defined, try 300 square pixels
        cv2.drawContours(sourceImage, contours, i, (0, 255, 0), 3)

函数cv2.inRange()也可以用,因为你决定使用BGR图像。

<强>参考:

http://en.wikipedia.org/wiki/YCbCr