我使用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;
}
答案 0 :(得分:2)
自适应阈值将为您提供清晰的边缘线,使您可以正确获得方块的9个方格。
您可以在此处看到全局和自适应阈值的正确比较:
在这里:https://sites.google.com/site/qingzongtseng/adaptivethreshold
原始图片:
全球门槛:
自适应阈值:
对于角落,我不确定它是否在论文中说明,但我会做类似的事情:
==&GT;为1
,2
,3
和{{1}找到4
,upper-left
,upper-right
,lower-left
等区域角落分别为
==&GT;使用模板匹配算法。
注意:您可能希望背景噪音较小。 =)