首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >解码2D圆形彩色条形码

解码2D圆形彩色条形码
EN

Stack Overflow用户
提问于 2017-06-01 10:40:15
回答 1查看 180关注 0票数 0

我是opencv的新手,用c++编程。我有一个任务是使用编码数组解码2D圆形条形码。我已经达到了能够将图形集中并使用Hough变换获得直线的地步。

需要帮助如何读取图像中的颜色,请注意,两个相邻的块中的每一个对应于一个字母。

任何指针都将受到高度赞赏。谢谢。

EN

Stack Overflow用户

发布于 2017-06-01 20:02:02

首先,您需要加载图像。我怀疑这不是问题,因为你已经在上面使用了Hough变换,但是:

代码语言:javascript
运行
复制
Mat img = imread(filename)

加载图像后,您可以使用以下命令获取任何像素:

代码语言:javascript
运行
复制
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个不同的字母。下一个问题是:字母是否排列在扫描线上,从左到右,从上到下?如果是,那么使用中心的十字准线定位图像将是很重要的。

如果图像是径向编码的(使用极坐标),那么事情就会变得有点棘手。您需要使用cvLinearPolarremap镜像。

否则,您需要遍历整个图像,步进RGB块的大小,并丢弃任何与中心的距离大于圆半径的像素。将所有像素读入数组后,将它们成对分组。

在某种程度上,我会说使用OpenCV来做这件事正朝着机器学习的方向发展。必须有一些点,你可以切入并使用神经网络来为你解码图像。一旦您有了圆(截断半径)并将图像居中,您可以转换为极坐标,并通过截断大于圆半径的所有内容来丢弃圆之外的所有内容。请记住,极坐标是(r,θ),因此您应该能够截断极坐标图像的右侧部分。

然后,您可以训练Neural Network将极轴图像作为输入并输出段落。

你必须提供大量的训练数据,而训练好的模型仍然依赖于你对图像进行预处理的能力。这将包括任何仿射变换,以防图像倾斜或旋转。在这一点上,你会对自己说,你已经完成了所有繁重的任务,最后一点真的不是那么难。

然而,一旦你得到了一个干净的映像的进程,你就可以开始添加一些步骤来引入ML来处理脏的映像。HoughCircles可用于检测要在其上运行检测的图像部分。接下来,您需要确定圆内的图像是否为条形码。

一个好的条形码系统将具有奇偶校验位或其他形式的纠错,但您可以使用机器学习来清理输出。

不管怎样,我的两分钱。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44297629

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档