透视扭曲条形码的分割
Segmentation of perspectively distorted barcodes
有些图像中的条形码存在透视变形。
它们使用 ZBar 进行定位和解码。
现在我不仅需要粗略位置,还需要条形码的四个真实角点,它们定义了封闭的 4 点多边形。
我尝试了不同的方法,但还没有得到想要的结果。
其中之一是:
- 将图像转换为灰度
- 阈值图像
- 侵蚀图像
- floodFill 以已知属于条形码一部分的像素开头
- 获取floodFill结果周围的轮廓
但是围绕这个轮廓我现在需要找到最小的最佳拟合 4 点多边形,这似乎是 not that easy。
您有更好的方法吗?
您可以使用以下代码并尝试通过 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
或
好的,我找到了适合我的用例的解决方案。
首先从 ZBar 结果生成扫描线。
现在在 cv::adaptivethreshold
的图像版本中发现了第一个和最后一个黑色像素,具有足够大的 blockSize
。
从那里开始,第一个和最后一个柱使用 cv::findContours
分割。
现在对于两个端杆,搜索彼此距离最远的两个轮廓点。
他们终于定义了封闭的 4 点多边形。
这与我在问题中发布的内容不完全相同,但由于加长保护图案而导致的额外尺寸对我来说无关紧要。
有些图像中的条形码存在透视变形。
它们使用 ZBar 进行定位和解码。
现在我不仅需要粗略位置,还需要条形码的四个真实角点,它们定义了封闭的 4 点多边形。
我尝试了不同的方法,但还没有得到想要的结果。 其中之一是:
- 将图像转换为灰度
- 阈值图像
- 侵蚀图像
- floodFill 以已知属于条形码一部分的像素开头
- 获取floodFill结果周围的轮廓
但是围绕这个轮廓我现在需要找到最小的最佳拟合 4 点多边形,这似乎是 not that easy。
您有更好的方法吗?
您可以使用以下代码并尝试通过 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
或
好的,我找到了适合我的用例的解决方案。
首先从 ZBar 结果生成扫描线。
现在在 cv::adaptivethreshold
的图像版本中发现了第一个和最后一个黑色像素,具有足够大的 blockSize
。
从那里开始,第一个和最后一个柱使用 cv::findContours
分割。
现在对于两个端杆,搜索彼此距离最远的两个轮廓点。
他们终于定义了封闭的 4 点多边形。
这与我在问题中发布的内容不完全相同,但由于加长保护图案而导致的额外尺寸对我来说无关紧要。