↑↑↑↑↑点击上方蓝色字关注我们!
作者:彭贯军
彭贯军,智能制造工业检测图像算法工程师,研究方向:IC芯片机器视觉检测技术。运营公众号:土盐。编者按:
通过一个生动的魔方案例,360°解释通用图像处理流程,启发大家掌握图像处理方法,启迪图像处理思维,开启进入智能化行业的大门。快来玩转这魔方吧!
来,我们拍一张魔方立方体的一面,接下来用下面程序分析识别其各小方块的矩形。
4张实验原图,文末回复关键词可得原图和运行代码:
方块体识别检测包含了通用的图像处理流程,如:图像加载储存方法、图像降噪预处理、边缘检测、阈值分割、余弦角度筛选等。本文用生动的图片进行分析,贴出源代码并进行代码注释,方便读者用原图和代码尝试运行实验,并进一步分享鲁棒的方块体检测资料[1]。
下文有程序的全部代码,这里展开具体的代码解释:
检测边缘较为容易,对检测到的边缘进行筛选就比较头疼了,这里通过对检测到的两条边缘夹角大于72.5度的为正方形边缘,有效的去除了众多杂线的干扰,从而提取出了感兴趣的方块体边缘。
这里使用角度余弦筛选得到矩形的方式比较新颖,余弦值小于0.3,即72.5度以上,认为是接近直角的边。
>>>>计算余弦值
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()实现的功能。
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);
>>>>
运用先前的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);
【调试】->【***项目属性】->【配置属性】->【调试】->【命令参数】
调试位置如图:
2 OpenCV库找图方法参考文献[3]中找不到如下代码提示的六张图,探索了如下OpenCV库找图,仍未找到,强行尝试上面给出的4张原图运行代码。
OpenCV库一般找图位置 .../doc/pics/
应用场景演示逆向思维,按照方法找需求,根据方块体近似关键词,搜索知网进一步查看相关技术应用研究内容。发现一篇博士论文:基于机器视觉的车辆几何尺寸测量系统研究。
相关图片如下:
感谢阅读,希望对你有所收获 。
参考文献:
[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在前进路上的茶馆驿站,提供个性化的带刺鱼汤。
『运筹OR帷幄算法社区』知识星球,依托社区20w+专业受众和20+细分领域硕博微信群,特邀腾讯,百度,阿里,华为等公司大咖与您一起聊算法,快来扫码加入!
加入『运筹OR帷幄』知识星球的好处
全球Top名校教授|博士和名企研发高管一起交流算法相关学术|研发干货
中国你能说出名字的几乎所有大厂|欧美数家大厂(资深)算法工程师入驻
依托『运筹OR帷幄』20w+专业受众和20+细分领域硕博微信群的算法技术交流
以上所有公司|高校独家内推招聘|实习机会、多家Offer选择指导
以面试题|作业题|业界项目为学习资料学习算法干货,从小白变成大咖
不定期的线上、线下交流会和聚会,拓展人脉
温馨提示
可以在 本公众号后台 回复关键词:“ 方块体识别”获取整体运行代码文件,如果觉得有用, 请勿吝啬你的留言和赞哦!~
—— 完 ——
文章申明
Aug.2019
文章作者:彭贯军
责任编辑:书生、稻草兔
微信编辑:葡萄
文章由『运筹OR帷幄』原创发布,如需转载请在公众号后台获取转载须知
优质公众号推荐
点击查看详情