【问题标题】:opencv my own 2D bar code readeropencv 我自己的二维条码阅读器
【发布时间】:2013-08-29 15:00:47
【问题描述】:

在谷歌上没有找到答案,所以请求你的帮助:我需要自己制作识别 2D 的 C++ 程序!!! (密码)条形码(手工制作的代码)。它由 20-100 行组成。每行 - 一个单词。

决定使用 OpenCV。需要在图片组上查找条形图,从左上角裁剪和扫描图片。

裁剪和代码搜索没有问题。不明白,如何正确识别黑白像素线以获得每条线的唯一组合。

据我所知,好方法 - 逐行查看白色像素或黑色,如果是黑色 - 写入 1,如果白色 = 0....,而不是像这样编写序列:

11111111 000000 111111 00000000000 111111111111111 0000000 1111 = 8 6 6 11 15 7 4(计数 1 和 0 数量)= 得到 866111574,而不是使用取决于作物宽度和高度的系数来找到合适的。

如何使用 Opencv 在 C++ 代码中编写这个?不明白。尝试使用 cvInitLineIterator ...你有什么建议?谢谢。

【问题讨论】:

  • 投反对票的原因。没有测试图像,你还没有开始学习opencv。您没有提供任何代码,这让我怀疑您是否付出了适当的努力,谷歌“如何在 opencv 中迭代图像”。如果你分解项目的每一个需求,你会在 stackoverflow、google 等上找到大量资源。从这里学习一些 opencv 教程:docs.opencv.org/3.1.0,尝试 python,除非你的 C 语言比 python 好得多。我建议 Andrew 给予高度回答,尤其是在分析条形码之前计算角点和单应性计算。

标签: opencv barcode pixel


【解决方案1】:

您可以像这样迭代槽像素:

uchar pixel = 0;
Mat img; // this must be grayscale image - type CV_8U
for(int i=0; i<img.rows; i++)
{
    // this loop is iterating from left to right
    for(int j=0; i<img.cols; j++)
    {
        pixel = img.at<uchar>(i,j);
        // do something (e.g. sum pixels)
        // OpenCV doesn't have binary image type, so usually white pixels value is 255
    }
}

更好的解决方案可能是使用findContoursminAreaRect,它们应该在每一行周围创建一个矩形:

vector<vector<Point>> vecContours;
vector<Vec4i> hierarchy;
RotatedRect currentRect; 

Mat binaryImage = imread(...)

// binaryImage should contain only shapes or edges, I suggest using one of these approaches:
// simple binary tresholding, try different threshold_value
threshold(binaryImage, binaryImage, threshold_value, 255, THRESH_BINARY);

// adaptiveTreshold works better when image is varying in brightness
// adjust blockSize and C (start with C=0)
adaptiveThreshold(binaryImage, binaryImage, 255, ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY, blockSize, C);

// another option would be to use Canny edge detector: 
// http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html

// find external contours, binaryImage = grayscale 8-bit image
// binaryImage is modified during findContours so we create a clone
findContours(binaryImage.clone(), vecContours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0, 0));

// find minAreaRect for each contour (each line)
for (size_t = 0; i < vecContours.size(); i++)
{   
    // filter unwanted objects (contours with less than 4 points, contours with too small area)
    if (vecContours[i].size() < 4 || contourArea(vecContours[i]) < someAreaInPixels)
        continue;

    // you can draw contours for debugging
    // drawContours(binaryImage, vecContours, i, Scalar(255,0,0), 1, 8, hierarchy, 0, Point());

    RotatedRect minRect = minAreaRect(vecContours.at(i));

    // now you can use minRect.size.width to determine width of the bar
    // minRect contains center point, size and angle
}

【讨论】:

  • 谢谢你的例子,但是“minRect.size.width 来确定条的宽度” - 这是第一个问题......但是黑条之间的白色区域的宽度呢?这也很重要。或者,可能需要使用任何掩码示例来比较行与示例?
  • 您可以将 RotatedRect 放在一个向量中,然后使用 std::sortrect.center.x 坐标对其进行排序。所以现在你有从左到右排序的矩形。然后你可以循环槽并提取它们之间的距离(通过使用 rect.center.xrect.width)。如果您需要帮助如何对向量进行排序,请询问。
  • 现在我看到你有多行条形码。在这种情况下,过程与之前类似,您只需先按 X 坐标排序,然后按 Y 坐标排序。向量将具有从左到右和从上到下的矩形序列。
【解决方案2】:

您还没有提供任何图像或代码片段,所以不太清楚您现在的情况。
一些一般的想法:

1) 搜索您的代码角。

2) 计算同应性。

3) 应用单应变换得到代码的方形图像。

4)你应该知道你的代码的行数(或行数),所以只需将图像划分为水平线。

5) 获取每一行的 ROI。计算沿垂直轴的像素总和 (cv::reduce)(以获得一些统计数据)。现在您有 1 条带有白色和黑色区域的水平线。

6) 将这条线分成 N 段(代码字长),然后计算每段的像素总和。

7) 应用阈值,您将获得代码。

【讨论】:

  • 感谢您的回答,代码看起来像二维码,但有一些差异。关于行数:我在设置中使用程序前选择行数(字数)。让它成为 100 行。条形码有10列。一个黑条可以使用 1 列,可以使用 2 或 3 列。酒吧之间的距离也不同。在 Opencv 中没有找到在桌子上分割图像的能力。可以做广告吗?
  • 可以使用矩阵运算来设置ROI,很简单,看看stackoverflow.com/questions/4031233/… 不过还有另外一种方法。如果您知道数据条的位置,您可以使用带有条索引的掩码。只需使用等于该条的索引的值填充条的位置。然后你只需要读取它,以及同一位置的图像像素值。
  • 您觉得,条形识别用什么方法比较好?我的程序现在可以从上到下扫描照片,绘制 1 像素高度和 100% 宽度的 ROI 矩形,步进下降 1 像素。我想使用直方图比较每个 1px ROI 来找到与模型条图片的匹配,但是它是否足够快速和正确或者可以提供更好的建议?
  • 如果您知道代码的行格式,您可以将模板缩放到您的行并计算每个代码位区域中的白色或黑色像素。如果 on 像素的数量超过 50%,则 bit 为 on,如果不是,则 bit 为 off。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多