c++输出方块_数据科学 | OpenCV方块体识别解决方案

↑↑↑↑↑点击上方蓝色字关注我们!


c++输出方块_数据科学 | OpenCV方块体识别解决方案_第1张图片


『运筹OR帷幄』原创

作者:彭贯军

彭贯军,智能制造工业检测图像算法工程师,研究方向:IC芯片机器视觉检测技术。运营公众号:土盐。 6ad50d81489fbcbf45f54e6cb30162b9.png

编者按:

通过一个生动的魔方案例,360°解释通用图像处理流程,启发大家掌握图像处理方法,启迪图像处理思维,开启进入智能化行业的大门。快来玩转这魔方吧!

一个生动的案例

来,我们拍一张魔方立方体的一面,接下来用下面程序分析识别其各小方块的矩形。

4张实验原图,文末回复关键词可得原图和运行代码:

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第2张图片 c++输出方块_数据科学 | OpenCV方块体识别解决方案_第3张图片 c++输出方块_数据科学 | OpenCV方块体识别解决方案_第4张图片 c++输出方块_数据科学 | OpenCV方块体识别解决方案_第5张图片

方块体识别检测包含了通用的图像处理流程,如:图像加载储存方法、图像降噪预处理、边缘检测、阈值分割、余弦角度筛选等。本文用生动的图片进行分析,贴出源代码并进行代码注释,方便读者用原图和代码尝试运行实验,并进一步分享鲁棒的方块体检测资料[1]。

下文有程序的全部代码,这里展开具体的代码解释:

检测边缘较为容易,对检测到的边缘进行筛选就比较头疼了,这里通过对检测到的两条边缘夹角大于72.5度的为正方形边缘,有效的去除了众多杂线的干扰,从而提取出了感兴趣的方块体边缘。

这里使用角度余弦筛选得到矩形的方式比较新颖,余弦值小于0.3,即72.5度以上,认为是接近直角的边。

>>>>

计算余弦值

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第6张图片

static double angle(Point pt1, Point pt2, Point pt0){  double dx1 = pt1.x - pt0.x;  double dy1 = pt1.y - pt0.y;  double dx2 = pt2.x - pt0.x;  double dy2 = pt2.y - pt0.y;  return (dx1*dx2 + dy1 * dy2) / sqrt((dx1*dx1 + dy1 * dy1)*(dx2*dx2 + dy2 * dy2) + 1e-10);}
>>>>

图像金字塔

这里运用图像金字塔来对图像降噪比较巧妙,对于较小的图像噪点,金字塔缩放后,噪点区域在缩小层被去除大部分,再对缩小层放大到原图像大小,噪点并没有被还原。这样很好的去处了图像噪点。

图像金字塔首先pyrDown()降采样,得到行列维度各缩小一半的图像,图像整体缩小到0.25倍大小。再pyrUp()向上放大到与原图像等大,内部新行列填充0。

pyrDown(image, pyr, Size(image.cols / 2, image.rows / 2));pyrUp(pyr, timg, image.size());vector contours;
>>>>

图像通道分离

这里需要识别的方块体是魔方的各个彩色小块,彩色图像通道分离成R、G、B三个通道,可以对不同颜色的彩色小块的颜色特征进行加强,提高易分离性,从而提高方块体识别能力。

mixChannels()通道分离函数类似cv::split(),事实上cv::split()调用mixChannels()实现的功能。

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第7张图片

int ch[] = { c, 0 };mixChannels(&timg, 1, &gray0, 1, ch, 1);
>>>>

l值调参

为了得到最佳的阈值处理效果。自定义l的值来调参使用。

// apply threshold if l!=0://tgray(x,y) = gray(x,y) < (l+1)*255/N ? 255 : 0gray = gray0 >= (l + 1) * 255 / N;
>>>>

thresh值调参

为了得到最佳的边缘检测效果。自定义thresh的值来调参使用。

//应用Canny。从滑块获取上限阈值//并将lower设置为0(强制边合并)Canny(gray0, gray, 0, thresh, 5);//dilate canny output to remove potential// holes between edge segments//膨胀canny得到的输出结果以消除边缘段之间的潜在孔洞dilate(gray, gray, Mat(), Point(-1, -1));
>>>>

多边形近似

得到轮廓的大致形状,轮廓越长,其值精度越高。arcLength(contours[i], true)*0.02为epsilon参数,原多边形与拟合后的多边形之间存在的最大偏差。

//近似轮廓,精度与轮廓周长成正比approxPolyDP(contours[i], approx, arcLength(contours[i], true)*0.02, true);

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第8张图片

>>>>

运用先前的angle()函数

从三点的点坐标得到两条线间的余弦值。

//找到交接边缘之间角度的最大余弦值double cosine = fabs(angle(approx[j % 4], approx[j - 2], approx[j - 1]));
>>>>

矩形条件判断

边缘点计算得到的余弦值小于0.3的多边形为需要的矩形。

//如果所有角度的余弦都很小(所有角度大致都是90度),则将quandrange顶点写入结果序列if (maxCosine < 0.3)  squares.push_back(approx);
>>>>

绘制矩形曲线

const Point* p = &squares[i][0];int n = (int)squares[i].size();polylines(image, &p, &n, 1, true, Scalar(0, 255, 0), 3, LINE_AA);
>>>>

窗体顶部名字命名方法

const char* wndname = "Square Detection Demo";imshow(wndname, image);

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第9张图片

C++源代码(带注释)

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第10张图片

试运行结果及说明

 0  运行结果如图

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第11张图片

1 图片配置方法

【调试】->【***项目属性】->【配置属性】->【调试】->【命令参数】

 调试位置如图:

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第12张图片

 图片具体配置位置如图:对于多张图片,中间用空格连接。c++输出方块_数据科学 | OpenCV方块体识别解决方案_第13张图片

2  OpenCV库找图方法

参考文献[3]中找不到如下代码提示的六张图,探索了如下OpenCV库找图,仍未找到,强行尝试上面给出的4张原图运行代码。

OpenCV库一般找图位置 .../doc/pics/

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第14张图片

应用场景演示

逆向思维,按照方法找需求,根据方块体近似关键词,搜索知网进一步查看相关技术应用研究内容。发现一篇博士论文:基于机器视觉的车辆几何尺寸测量系统研究。

相关图片如下:

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第15张图片

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第16张图片

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第17张图片

感谢阅读,希望对你有所收获 。

参考文献:

[1] https://github.com/dwalton76/rubiks-cube-tracker

[2] https://github.com/opencv/opencv/blob/master/samples/cpp/squares.cpp

[3] https://answers.opencv.org/question/70958/recognise-colours-in-3x3-grid/#71026

[4] 卞晓东. 基于机器视觉的车辆几何尺寸测量系统研究[D].东南大学,2005

相关文章推荐

图像作为数据金矿之一,需要挖矿人有一把好铲子,下面的链接给你一把称手的兵器,来啊,开挖啊。

点击蓝字标题,即可阅读《数据科学 | 为什么富人越富,穷人越穷?》

其他

数据科学 | 什么是数据挖掘?

AI | 宝贵的计算机视觉岗实习面经礼物,请签收!

推荐公众号:  土盐

土盐AI,致力于建设AIers在前进路上的茶馆驿站,提供个性化的带刺鱼汤。

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第18张图片

『运筹OR帷幄算法社区』知识星球,依托社区20w+专业受众和20+细分领域硕博微信群,特邀腾讯,百度,阿里,华为等公司大咖与您一起聊算法,快来扫码加入!

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第19张图片

 加入『运筹OR帷幄』知识星球的好处

  • 全球Top名校教授|博士和名企研发高管一起交流算法相关学术|研发干货

  • 中国你能说出名字的几乎所有大厂|欧美数家大厂(资深)算法工程师入驻

  • 依托『运筹OR帷幄』20w+专业受众和20+细分领域硕博微信群的算法技术交流

  • 以上所有公司|高校独家内推招聘|实习机会、多家Offer选择指导

  • 以面试题|作业题|业界项目为学习资料学习算法干货,从小白变成大咖

  • 不定期的线上、线下交流会和聚会,拓展人脉

温馨提示

可以在 公众号后台 回复关键词:“ 方块体识别”获取整体运行代码文件,如果觉得有用, 请勿吝啬你的留言和赞哦!~

—— 完 ——

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第20张图片

9c7f1927abb8a3ad147fb98ece0255ba.gif

文章申明

Aug.2019

文章作者:彭贯军

责任编辑:书生、稻草兔

微信编辑:葡萄

文章由『运筹OR帷幄』原创发布,如需转载请在公众号后台获取转载须知

2611b40dd970e2670af81a2a1d199f89.png 2611b40dd970e2670af81a2a1d199f89.png

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第21张图片c++输出方块_数据科学 | OpenCV方块体识别解决方案_第22张图片


44e093db6000137e9acc8ae15ae8b5b8.png

优质公众号推荐

点击查看详情

c++输出方块_数据科学 | OpenCV方块体识别解决方案_第23张图片  c++输出方块_数据科学 | OpenCV方块体识别解决方案_第24张图片 c++输出方块_数据科学 | OpenCV方块体识别解决方案_第25张图片

你可能感兴趣的:(c++输出方块,opencv,拟合圆,c++,opencv,车辆识别,opencv,轮廓放大,opencv项目案例)