使用Opencv读取rubik立方体的颜色

我使用OpenCV编写了一个C程序,可以从实时视频中检测并突出显示任何对象的边缘.但现在我不知道如何从视频中检测到的许多边缘中提取立方体的四个角.所以我在这里寻求帮助.

这是我用作该项目指南的论文链接.
http://www.cs.ubc.ca/~andrejk/525project/525report.pdf
您可以在下面的链接中找到本文的程序代码.它是用Python编写的. (我使用的是C,我不知道Python)
http://www.cs.ubc.ca/~andrejk/525project/cubefinder.py

根据该论文,下一步将是“具有自适应阈值的边缘分割”.
我真的不明白.而且我也不知道如何提取立方体的角落.

我使用的方法的简短摘要如下.
1.从网络摄像头输入
2.应用拉普拉斯滤波器
3.应用霍夫线变换.

我得到以下结果.

using namespace std;
using namespace cv;

Mat laplacianFilter(Mat image)
{
Mat hImage;

GaussianBlur(image,hImage,Size(3,3),0,0,BORDER_DEFAULT);
cvtColor(hImage,hImage,CV_RGB2GRAY);
Laplacian(hImage,hImage,CV_16SC1,3,1,0,BORDER_DEFAULT);
convertScaleAbs(hImage,hImage,1,0);

return hImage;
}

Mat hghTransform(Mat image, Mat &image2)
{
Mat lImage;

Canny(image,image,50,200,3);
cvtColor(image,lImage,CV_GRAY2BGR);

    vector<Vec4i> lines;
    HoughLinesP(image, lines, 1, CV_PI/180, 50, 50, 10 );
    for( size_t i = 0; i < lines.size(); i++ )
    {
        Vec4i l = lines[i];
        line( image2, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,255,0), 3, CV_AA);
    }

return lImage;
}


int main()
{
int c;

VideoCapture cap(0);

Mat image;
Mat image2;

namedWindow("hghtransform");
namedWindow("laplacianfilter");
namedWindow("cannyOutput");

while(1)
{
    cap>>image;
    cap>>image2;

    //Output
    imshow("laplacianfilter",laplacianFilter(image));
    imshow("cannyOutput",hghTransform(laplacianFilter(image),image2));
    imshow("hghtransform",image2);

    c=waitKey(33);

    if(c==27)
        return 0;

}

return 0;
}

最佳答案 自适应阈值将为您提供清晰的边缘线,使您可以正确地获得9个正方形的方块.

您可以在此处看到全局和自适应阈值的正确比较:
这里:https://sites.google.com/site/qingzongtseng/adaptivethreshold

原图:

全球门槛:

自适应阈值:

对于角落,我不确定它是否在论文中说明,但我会做类似的事情:
==>分别为左上角,右上角,左下角和右下角找到1,2,3,4等区域
==>使用模板匹配算法.

希望能帮助到你.

注意:您可能希望背景噪音较小. =)

点赞