我目前正在使用openCv做一些计算机视觉。我有一个标签上的瓶子样品。我试图确定什么时候瓶子上没有标签。 标签是矩形的。
我使用Canny进行了边缘检测。我尝试使用findcountour()来检测瓶子是否有内部轮廓(这将代表矩形标签)。
答案 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小组完成的 - 1和2 ..
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图像。
<强>参考:强>