这样的标准上海市疫情防控工作领导小组也好意思发布出来?

人民日报林治波社长发出灵魂拷问:你们是没有常识,还是没有良知?

伊朗著名美女明星、奥斯卡影后被捕!

母子乱伦:和儿子做了,我该怎么办?

阳了后,14亿人民才发现集体被忽悠了!

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

魔方最快速识别六面颜色

点击下方卡片,关注“新机器视觉”公众号

重磅干货,第一时间送达


前言


我们报了机械手解魔方的项目!其中的方案之一是用摄像头采集魔方的六面信息!为了最快的采集信息,决定使用两个摄像头顶角照射,一个摄像头读取三面信息,这样两个摄像头一次直接读取完!


其中最快的方法就是两个摄像头,顶角摆放,采集六面信息!


这其中,我有两种方案!


1、直接在倾斜面上颜色识别采集信息,在进行面矩阵转换;


2、将倾斜面矫正回来,在进行颜色识别!在两种的综合尝试下,我们采用第二种!


我用的开发环境是  QT+OpenCV  


代码及解释:


cv::Mat colorhandle::getFrame_f(){     cv::Mat imageout;     if(!camera_f_stop){         capture_f>>frame_f;       // cv::blur(frame_f, imageout, cv::Size(2,2));//        cv::medianBlur(frame_f, imageout, 3);        imageout = frame_f;        return imageout;    }}


以上是一个摄像头的图像帧获得,两个同理!


cv::Mat colorhandle::splitColor(cv::Mat tempIge){     char vr,vg,vb;    cv::Mat temp;     temp= cv::Mat(frame_f.size(),frame_f.type(),cv::Scalar::all(0));     for(int r=0;r<tempIge.rows;r++){         cv::Vec3b *pixVal = tempIge.ptr<cv::Vec3b>(r);         for(int c=0;c<tempIge.cols;c++){             vr = pixVal[c][2];            vb = pixVal[c][1];            vg = pixVal[c][0];             if(abs(vr-vb)>pix_val_gal || abs(vg-vb)>pix_val_gal){                 temp.at<cv::Vec3b>(r,c)[2] =vr;                temp.at<cv::Vec3b>(r,c)[1] =vb;                temp.at<cv::Vec3b>(r,c)[0] =vg;            }        }    }     return temp; }


这是一个简单的获取彩色图像的方法,可以获得面的信息!当然还有获取状况如下:



接下来就是进行面的矫正!这个地方很关键。


有很多种的方法,我一开始用的是将线将边画出来,当然了我在软件里也是读取这一块的信息,向上面的就是三个面,也就是三个大块的信息。


一下是我的摄像头图像 !这里是为了方便校准才显示的。



接下来就是最最关键的地方了,我如何将每个块的信息转化出来呢?这就需要OpenCV的仿射变换了!


void colorhandle::mWrapHandle(cv::Mat imgGet,std::vector<cv::Point2f> vecPoint, cv::Mat partImgeOut){      //这里矫正图片区域     std::vector<cv::Point2f>quad_pts;     quad_pts.push_back(cv::Point2f(0,0));    quad_pts.push_back(cv::Point2f(partImgeOut.cols,0));    quad_pts.push_back(cv::Point2f(partImgeOut.cols,partImgeOut.rows));    quad_pts.push_back(cv::Point2f(0,partImgeOut.rows));     cv::Mat transmtx =cv::getPerspectiveTransform(vecPoint,quad_pts);;    cv::warpPerspective(imgGet,partImgeOut,transmtx,partImgeOut.size()); }


以上就是仿射变化了,它是依据点的四边形变换,不同的起点,带来的是不同旋转的效果,所以非常方便的就把面矫正成我想要的效果!



以上看出我是矫正的左下角的面,效果看上去还可以!!!



这是面的数据输出,位置信息,可见精度是非常高的!再下面界面中的   ycyyrbbbc 就是每面的颜色表示。


这样的操作六个面,就可以最快速读取魔方的信息。


给大家分享一下我的未完成的小界面  :



然而实际中,机械手当着了视线,所以,不得不换种方式来读取!但是还是要和大家分享一下我们的设计方案!


最后,我们的视觉方案,如下:

https://blog.csdn.net/qq_37389133/article/details/80345924

本文仅做学术分享,如有侵权,请联系删文。

—THE END—

文章有问题?点此查看未经处理的缓存