魔方最快速识别六面颜色

前言:
      今年有一个高等教育部主办,举办地在余姚的比赛,我们报了机械手解魔方的项目!其中的方案之一是用摄像头采集魔方的六面信息!为了最快的采集信息,决定使用两个摄像头顶角照射,一个摄像头读取三面信息,这样两个摄像头一次直接读取完!

        其中最快的方法就是两个摄像头,顶角摆放,采集六面信息!
     这其中,我有两种方案!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  就是每面的颜色表示!
这样的操作六个面,就可以最快速读取魔方的信息!
给大家分享一下我的未完成的小界面  :
 

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

最后,我们的视觉方案,如下点击打开链接

欢迎指点,互相学习!

  • 8
    点赞
  • 61
    收藏
    觉得还不错? 一键收藏
  • 24
    评论
### 回答1: 要使用OpenCV识别魔方颜色,可以遵循以下步骤: 1.图像采集:使用摄像头或导入图像的方式获取魔方的图像。 2.预处理:对图像进行预处理以减少噪声和提高颜色分割的准确性。可以使用图像平滑化、二值化和形态学运算等技术来实现。 3.颜色分割:通过颜色的阈值分割算法,将魔方图像中的每个颜色分割出来。可以通过调整阈值来识别不同的颜色。 4.轮廓提取:使用轮廓提取算法,将分割后的颜色区域转换为轮廓,并对轮廓进行筛选,保留符合魔方小块形状的轮廓。 5.颜色识别:通过颜色空间转换,将每个分割的颜色区域从RGB颜色空间转换到HSV或Lab颜色空间。然后,通过设定阈值范围,在颜色空间中识别魔方颜色。 6.魔方还原:将识别出的颜色映射为魔方的表颜色,并进行还原算法,恢复魔方的原始状态。 以上是使用OpenCV识别魔方颜色的基本步骤。不同的魔方图像可能需要使用不同的颜色识别方法和参数调整,以获得更好的识别效果。此外,可以结合机器学习和深度学习等技术,进一步提高魔方颜色识别的准确性和鲁棒性。 ### 回答2: OpenCV是一个开源计算机视觉库,被广泛应用于图像和视频处理任务。要使用OpenCV识别魔方颜色,可以按照以下步骤进行: 1. 首先,通过摄像头或图像获取魔方的图像。 2. 使用OpenCV颜色空间转换函数将图像从RGB颜色空间转换为HSV颜色空间。这是因为HSV颜色空间更适合进行颜色识别,由于HSV颜色空间将颜色分解为色调(Hue),饱和度(Saturation)和亮度(Value)三个分量。 3. 根据魔方颜色的特征在HSV图像中定义一个区域来进行颜色分割。例如,对于红色,可以定义一个色调区间在0到20之间,并指定合适的饱和度和亮度阈值。 4. 对于每个区域,计算其像素数目。根据像素的数目,可以判断该区域的颜色是否存在。 5. 重复上述步骤,对于魔方的每一个进行颜色识别。 6. 根据识别到的颜色数据,可以进行魔方的解算或者其他操作。 总结来说,利用OpenCV可以通过转换颜色空间和颜色分割的方式,实现对魔方颜色识别。通过分析图像中的像素,可以获得魔方各个颜色信息,为进一步操作或解算提供便利。 ### 回答3: OpenCV是一个开源的计算机视觉库,可以用于图像处理、分析和识别。要识别魔方颜色,可以通过以下几个步骤进行。 首先,需要将魔方的图像输入到OpenCV中进行处理。可以使用摄像头拍摄魔方的图像或者加载魔方图片。获取魔方图像后,可以使用OpenCV中的图像处理函数对图像进行预处理,如灰度化、去噪等操作,以提高颜色识别的准确性。 接下来,可以使用OpenCV中的颜色空间转换函数将图像从RGB颜色空间转换到HSV(色相、饱和度、亮度)颜色空间。HSV颜色空间更适合进行颜色识别,因为它能够区分亮度和颜色信息。 然后,可以使用OpenCV中的阈值分割函数根据颜色范围对图像进行分割,将魔方每个色块分离出来。可以根据魔方的标准颜色进行阈值设定,比如红、蓝、绿、白、黄和橙等颜色。 最后,可以通过连通组件分析等技术对分割后的色块进行形状和大小的分析,进一步确定魔方颜色。可以使用OpenCV中的轮廓检测、积计算等函数来进行分析,并根据各个色块的属性进行颜色识别。 综上所述,通过OpenCV魔方图像进行预处理、颜色空间转换、阈值分割和形状分析等操作,可以实现魔方颜色识别。当然,对于不同的魔方和图像条件,可能需要调整参数和算法以达到更好的识别效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值