我是opencv的新手,用c ++编码。我有一项任务是使用编码数组解码2D圆条形码。我能够集中图形并使用Hough变换获得线条。
需要有关如何读取图像中颜色的帮助,请注意两个相邻块中的每一个都对应一个字母。
任何指针都将受到高度赞赏。谢谢。
答案 0 :(得分:0)
首先,您需要加载图像。我怀疑这不是一个问题,因为你已经在它上面使用Hough变换了,但是:
Mat img = imread(filename)
加载图像后,您可以使用以下方法抓取任何像素:
Scalar intensity = img.at<uchar>(y, x);
但是,您需要做的是对图像进行阈值处理。正如我在评论中提到的,每个0
频道的图片颜色为255
或RGB
。这是为了在存在图像伪像的情况下对数据进行编码。如果频道高于某个颜色值,那么您会认为该频道超过某个颜色值。如果在下面,它会关闭&#39;。
使用adaptiveThreshold阈值图像。我将阈值降低到二进制1或0.这将产生RGB三元组,它是八(2 ^ 3)种可能组合之一,从(0,0,0)到(1,1,1)。
然后你需要走像素。这是它变得有趣的地方。
你说每个相邻的2个像素形成一个字母。这是2 ^ 6或64个不同的字母。接下来的问题是:字母排列在扫描线上,从左到右,从上到下?如果是,那么使用十字准线在中心定位图像非常重要。
如果图像是径向编码的(使用极坐标),那么事情会变得有点棘手。您需要使用cvLinearPolar来remap图片。
否则,您需要遍历整个图像,踩踏RGB块的大小并丢弃距离中心的距离大于圆的半径的任何像素。将所有像素读入数组后,将它们成对分组。
在某些时候,我会说使用OpenCV这样做是朝向机器学习。必须有一些地方可以切入并使用神经网络为您解码图像。一旦你有圆(截止半径)并且图像居中,你可以转换为极坐标并通过切除大于圆半径的所有东西来丢弃圆外的所有东西。请记住,极坐标是(r,theta),所以你应该能够截断极地图像的右边部分。
然后你可以训练Neural Network将极图像作为输入并吐出段落。
您必须提供大量的训练数据,训练有素的模型仍然依赖于您预处理图像的能力。这将包括在图像倾斜或旋转的情况下的任何仿射变换。那时你会对自己说你已经完成了所有繁重的工作,最后一点也不是那么难。
但是,一旦您获得了处理干净图像的流程,您就可以开始添加步骤以引入ML来处理脏图像。 HoughCircles可用于检测要运行检测的图像部分。接下来,您需要确定圆圈内的图像是否为条形码。
一个好的条形码系统会有奇偶校验位或其他形式的纠错,但您可以使用机器学习来清理输出。
反正我的2美分。