压板识别项目分析
1.图片为保护压板正常方式投入,要求图像识别能正确判断,并将保护压板投退状态显示出来。
2.保护压板漏投(误投),要求图像识别能发现报警,并显示出是哪些保护压板漏投。
3.保护压板有投退异常现象,要求图像识别能发现报警,并显示出是哪些保护压板异常。
4.通过保护盘二维码(或条形码),要能识别出来保护盘柜名称
(正常情况下的图片)
(存在问题的图片1)
(存在问题的图片2)
二、初步分析:
其实需求主要是两个方面,一个是识别出压板的情况,二个是识别条码。
2.1识别压板:
常见的图像初步处理(换色彩域->OSTU->投影分析),对于初始的三幅图像,都能够得到比较干净的结果。但是这种情况过于理想了,在实
际项目中,需要考虑到由于其他原因引起的噪音,可能需要采用一定的方法去除噪音。此外,第5和第9个开关,采用的是和背景颜色比
较接近的压板,在实际项目中容易混乱,但是这个结果是原始需求直接关注的结果,可能要采用其他方法来强化 。
threshold(matSplit[ 1],ostu, 100, 255,THRESH_OTSU);
dstclone = ostu.clone();
// 做竖直的投影。这里由于更关心截断的情况,而不关心具体升降,所以是画出截断线而不是画波形
for ( int i = 0;i <ostu.cols;i ++)
{
Mat data = ostu.col(i);
int itmp = countNonZero(data);
vectorV.push_back(itmp);
}
//上波形为VUpper,下波形为VDown
for ( int i = 1;i <vectorV.size();i ++)
{
if (vectorV[i - 1] == 0 && vectorV[i] > 0)
{
VUpper.push_back(i);
}
if (vectorV[i - 1] > 0 && vectorV[i] == 0)
{
VDown.push_back(i);
}
}
//计算结果
for ( int i = 0;i <VUpper.size();i ++)
{
Mat roitmp = ostu(Rect(VUpper[i], 0,VDown[i] -VUpper[i],ostu.rows));
dilate(roitmp,roitmp,Mat()); //对ostu的结果适当膨胀
int uppertimes = 0;
for ( int j = 0;j <ostu.rows;j ++)
{
Mat data = roitmp.row(j);
int itmp = countNonZero(data);
vectorH.push_back(itmp);
}
for ( int j = 0;j <vectorH.size() - 1;j ++)
{
if (vectorH[j] > 0 && vectorH[j + 1] == 0)
{
HDower.push_back(j);
}
if (vectorH[j] == 0 && vectorH[j + 1] > 0)
{
HUpper.push_back(j);
}
}
if (HUpper.size() < = 1)
{
result[i] = 1;
//printf("结果为连在一起的\n");
}
else
{
int iresult = 0;
for ( int j = 0;j <HDower.size() - 1;j ++)
{
//得出之间空白的区域
int iwidth = HUpper[j + 1] - HDower[j];
if (iwidth > 10)
{
iresult = iresult + 1;
}
}
if (iresult > 0 )
{
result[i] = 0;
// printf("结果为断开的\n");
}
else
{
result[i] = 1;
//printf("结果为连在一起的\n");
}
iresult = 0;
}
vectorH.clear();
HUpper.clear();
HDower.clear();
uppertimes = 0;
}
三、难点攻关:
3.1第5和第9压板的特殊情况。
由于第5和第9压板的颜色和背景颜色非常接近,所以采用特殊的方法来进行处理。通过观察,结合常理。压板打开之后,必然带来的结果就
是下垂并且将下面的字符牌遮挡。那么可以通过反过来判断字符牌是否被遮盖来判断压板是否被打了下来。
(字符遮挡)
3.2倾斜情况下,条码识别错误
受到摄像头分辨率的限制,使得图像中条形码在倾斜的时候,受到插值算法的影响,边缘变得模糊。虽然尝试了许多方法,但是都无法达到
能够让zxing识别的程度。这个问题不知道哪位有更好的方法,如果可以的话,希望能够告之。
四、系统集成:
由于目前还没有很好地将zxing集成到mfc的环境中来。由于我对“csharp通过dll方式调用console程序”比较熟悉,所以这里尝试采用的是"csharp通过程序调用console的形式"。也就是主要图像处理的部分还是写的console程序,并且运算出相应的结果和图片,而后在csharp的程序中合并得到最后的结果。过程中发现这种方法的问题还是比较多的,包括参数的传递、程序重复运行时的控制等,应该说不是一种很成熟的方法,在以后面对类似的问题的时候,最好是能够直接将代码集成到mfc中,否则就要采用“csharp通过dll方式调用console程序”的方式。
最后的结果如下,并且可以多次测试都没有问题:
五、设计小结:
工作完成了,那么除了对代码进行重构并且提取出可以被重复使用的函数外,对于思路的小结也非常重要。在本例中:
5.1 提出了具有创造性的一个想法:采取分析下面的字符牌是否被遮挡的方式来判断开关闭合情况。逆向思维取得了稳定的结果;
5.2 对于色彩空间转换、对于投影的灵活运用构成了识别的主体。
不足的地方
5.3 对于一维/二维码识别没有构建稳定的库或解决方案,现在使用的zxing可以解决一部分问题,但是不过不了解原理,遇到不能解决的问题就无法继续优化;目前提取条码的方法应该被提出出来。
5.4 验证了"csharp通过程序调用console的形式"是不合算的。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
为什么不去读顶级会议上的论文?适应于机器学习、计算机视觉和人工智能?
为什么不去读顶级会议上的论文?适应于机器学习、计算机视觉和人工智能? 看了版上很多贴子,发现很多版友都在问“热门研究方向”、“最新方法”等。有同学建议国内某教授的教材、或者CNKI、或者某些SCI期刊。每当看到这种问题,我都有点纳闷,为什么不去读顶级会议上的论文? 我无意否认以上文献的价值,但是在机器学习、计算机视觉和人工智能领域,顶级会议才是王道。国内教材和CNKI上的基本是N年前老掉牙的东西。有人会质疑这些会议都只是EI。是的,这的确非常特殊:在许多其它领域,会议都是盛会,比如society of neuroscience的会议,每次都有上万人参加,带个abstract和poster就可以去。但在所讨论的几个领域,顶级会议的重要性无论怎么强调都不为过。 可以从以下几点说明: (1)因为机器学习、计算机视觉和人工智能领域发展非常迅速,新的工作层出不穷,如果把论文投到期刊上,一两年后刊出时就有点out了。因此大部分最新的工作都首先发表在顶级会议上,这些顶级会议完全能反映“热门研究方向”、“最新方法”。 (2)很多经典工作大家可能引的是某顶级期刊上的论文,这是因为期刊论文表述得比较完整、...
- 下一篇
选择轮廓(select_shape)
选择轮廓(select_shape) Halcon是一款运用广泛的图像识别和处理软件。在肤浅的接触中,它的轮廓选择算子(select_shape)给予我很深的印象。结果是往往几行代码就能够产生很好的效果: 比如要得到这样的结果 只需要 read_image (Image1, 'F:/未来项目/钢管识别/FindTube/FindTube/1.jpg') rgb1_to_gray (Image1, GrayImage) threshold (GrayImage, Regions, 43, 111) connection (Regions, ConnectedRegions) select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 150, 666) select_shape (SelectedRegions, SelectedRegions1, 'circularity', 'and', 0. 45, 1) 当然Halcon是在背后做了许多工作的。 几行代码中,比较重要的是算子就是"se...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS7,8上快速安装Gitea,搭建Git服务器
- 设置Eclipse缩进为4个空格,增强代码规范
- SpringBoot2全家桶,快速入门学习开发网站教程
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- Red5直播服务器,属于Java语言的直播服务器
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2更换Tomcat为Jetty,小型站点的福音