我是opencv的新手,用c++编程。我有一个任务是使用编码数组解码2D圆形条形码。我已经达到了能够将图形集中并使用Hough变换获得直线的地步。
需要帮助如何读取图像中的颜色,请注意,两个相邻的块中的每一个对应于一个字母。
任何指针都将受到高度赞赏。谢谢。

发布于 2017-06-01 20:02:02
首先,您需要加载图像。我怀疑这不是问题,因为你已经在上面使用了Hough变换,但是:
Mat img = imread(filename)加载图像后,您可以使用以下命令获取任何像素:
Scalar intensity = img.at<uchar>(y, x);但是,您需要做的是对图像进行阈值处理。正如我在注释中提到的,对于每个RGB通道,图像颜色要么是0,要么是255。这是为了在存在图像伪像的情况下对数据进行编码。如果通道高于某个颜色值,则认为它是“开”的,如果低于某个颜色值,则认为它是“关”。
使用adaptiveThreshold对图像进行阈值处理。我会把阈值降到二进制1或0。这将产生八(2^3)个可能的组合之一的RGB三元组,从(0,0,0)到(1,1,1)。
然后你需要遍历像素。这就是有趣的地方。
你说每个相邻的2个像素形成一个字母。这是2^6或64个不同的字母。下一个问题是:字母是否排列在扫描线上,从左到右,从上到下?如果是,那么使用中心的十字准线定位图像将是很重要的。
如果图像是径向编码的(使用极坐标),那么事情就会变得有点棘手。您需要使用cvLinearPolar来remap镜像。
否则,您需要遍历整个图像,步进RGB块的大小,并丢弃任何与中心的距离大于圆半径的像素。将所有像素读入数组后,将它们成对分组。
在某种程度上,我会说使用OpenCV来做这件事正朝着机器学习的方向发展。必须有一些点,你可以切入并使用神经网络来为你解码图像。一旦您有了圆(截断半径)并将图像居中,您可以转换为极坐标,并通过截断大于圆半径的所有内容来丢弃圆之外的所有内容。请记住,极坐标是(r,θ),因此您应该能够截断极坐标图像的右侧部分。
然后,您可以训练Neural Network将极轴图像作为输入并输出段落。
你必须提供大量的训练数据,而训练好的模型仍然依赖于你对图像进行预处理的能力。这将包括任何仿射变换,以防图像倾斜或旋转。在这一点上,你会对自己说,你已经完成了所有繁重的任务,最后一点真的不是那么难。
然而,一旦你得到了一个干净的映像的进程,你就可以开始添加一些步骤来引入ML来处理脏的映像。HoughCircles可用于检测要在其上运行检测的图像部分。接下来,您需要确定圆内的图像是否为条形码。
一个好的条形码系统将具有奇偶校验位或其他形式的纠错,但您可以使用机器学习来清理输出。
不管怎样,我的两分钱。
https://stackoverflow.com/questions/44297629
复制相似问题