Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 解码二维圆形彩色条形码_C++_Opencv - Fatal编程技术网

C++ 解码二维圆形彩色条形码

C++ 解码二维圆形彩色条形码,c++,opencv,C++,Opencv,需要了解如何读取图像中的颜色的帮助时,请注意,两个相邻块中的每个块对应一个字母 任何提示都将受到高度赞赏。谢谢 首先,您需要加载图像。我怀疑这不是问题,因为您已经在上面使用了Hough变换,但是: Mat img = imread(filename) 加载图像后,您可以使用以下方法获取任意像素: Scalar intensity = img.at<uchar>(y, x); 标量强度=img.at(y,x); 但是,您需要做的是对图像设置阈值。正如我在评论中提到的,每个RGB频

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

任何提示都将受到高度赞赏。谢谢
首先,您需要加载图像。我怀疑这不是问题,因为您已经在上面使用了Hough变换,但是:

Mat img = imread(filename)
加载图像后,您可以使用以下方法获取任意像素:

Scalar intensity = img.at<uchar>(y, x);
标量强度=img.at(y,x);
但是,您需要做的是对图像设置阈值。正如我在评论中提到的,每个
RGB
频道的图像颜色要么是
0
要么是
255
。这是为了在存在图像瑕疵的情况下对数据进行编码。如果通道高于某个颜色值,那么你会考虑它是“on”,如果在下面,它是“off”。 使用阈值设置图像。我会将阈值降低到二进制1或0。这将产生从(0,0,0)到(1,1,1)的八(2^3)种可能组合之一的RGB三联体

然后,您需要遍历像素。这就是它变得有趣的地方

你说每个相邻的2个像素组成一个字母。这是2^6或64个不同的字母。下一个问题是:字母是否按扫描线排列,从左到右,从上到下?如果是,则重要的是使用中心的十字线确定图像的方向

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

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


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

然后你可以训练a将极坐标图像作为输入,并写出段落

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

但是,一旦您获得了一个处理干净图像的流程,您就可以开始添加步骤,引入ML来处理脏图像。HoughCircles可用于检测要运行检测的图像部分。接下来,您需要确定圆圈内的图像是否为条形码

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


无论如何,我的2美分。

嗯,我不确定这是否有用,但这些颜色在R、G、B频道中都是
1
0
。开或关。(字节格式为0或255)。如果你把它们看作比特,那么有8种颜色组合。从黑色(0,0,0)到白色(1,1,1)。如果两个相邻的颜色组成一个字母,那么就有64个不同的字母(2^6)。你是对的,有64个字符,如果我把它们全部组合起来,它就会写出一个段落。唯一的一点是,中间的水平和垂直的块是不可被读取的,它们只是用来使图像竖直。你能解释一下:注意这两个相邻的块对应于一个字母吗?我会从中间开始,找到一个单色块,以了解每个块的偏移量,然后像每个偏移量+块长度一样,检查是否均匀,是否有黑色边框,如果是,添加到一些向量。