图像中有透视扭曲的条形码。
使用ZBar找到并解码它们。
现在,我不仅需要粗略的位置,还需要条形码的四个真实角点,它们定义了包围的4点多边形。
我尝试了不同的方法,但还没有得到理想的结果。 其中一个是:
但是在这个轮廓周围,我现在需要找到最小的最佳拟合4点多边形,这似乎是not that easy。
您对更好的方法有什么想法吗?
答案 0 :(得分:2)
您可以使用以下代码并尝试通过approxPoly
将轮廓缩小为4点多边形向量约;
for (size_t i = 0; i < contours.size(); i++)
{
approxPolyDP(Mat(contours[i]), approx,
arcLength(Mat(contours[i]), true)*0.02, true);
if (approx.size() == 4 &&
fabs(contourArea(Mat(approx))) > 1000 &&
isContourConvex(Mat(approx)))
{
double maxCosine = 0;
for( int j = 2; j < 5; j++ )
{
double cosine = fabs(angle(approx[j%4], approx[j-2], approx[j-1]));
maxCosine = MAX(maxCosine, cosine);
}
if( maxCosine < 0.3 )
squares.push_back(approx);
}
}
http://opencv-code.com/tutorials/detecting-simple-shapes-in-an-image/
您也可以尝试以下方法,也许它们会为您产生足够好的效果: http://docs.opencv.org/modules/imgproc/doc/structural_analysis_and_shape_descriptors.html?highlight=minarearect#minarearect
或
答案 1 :(得分:2)
好的,我找到了一个对我的用例来说足够好的解决方案。
首先从ZBar结果生成扫描线。
现在第一个和最后一个黑色像素位于cv::adaptivethreshold
得到的图像的正面,且blockSize
足够大。
从那里开始,使用cv::findContours
对第一个和最后一个条进行分段。
现在对于两个结束条,搜索彼此距离最远的两个轮廓点。
他们最终定义了封闭的4点多边形。
这不完全是我在我的问题中发布的内容,但由于细长的防护模式而增加的尺寸在我的情况下并不重要。