opencv 检测直线检测不到了。求帮助~!!
lines=cvHoughLines2(cannyImg,storage,CV_HOUGH_PROBABILISTIC,1,CV_PI/180,10,5,10);for(...
lines = cvHoughLines2 (cannyImg, storage, CV_HOUGH_PROBABILISTIC,1,CV_PI/180, 10, 5, 10);
for (int i = 0; i < lines->total; i++){
CvPoint* line = (CvPoint*)cvGetSeqElem (lines, i);
double slope = ((double)(line[0].y - line[1].y))/((double)(line[0].x - line[1].x)); //斜率
if(atan(slope) > 10 && atan(slope) < 30){ //要在10-30度之间的直线
cvLine (pImgDst, line[0], line[1], CV_RGB(255,0,0),2,8); //画出红色直线
}
}
如果不加 if 判断就可以检测出来 展开
for (int i = 0; i < lines->total; i++){
CvPoint* line = (CvPoint*)cvGetSeqElem (lines, i);
double slope = ((double)(line[0].y - line[1].y))/((double)(line[0].x - line[1].x)); //斜率
if(atan(slope) > 10 && atan(slope) < 30){ //要在10-30度之间的直线
cvLine (pImgDst, line[0], line[1], CV_RGB(255,0,0),2,8); //画出红色直线
}
}
如果不加 if 判断就可以检测出来 展开
1个回答
展开全部
你可真有分,上次的既然我没有解释清楚怎么不继续追问?
问清楚再给分啊。
根据你这个图我觉得用霍夫检测直线效果不好,晚上给你仔细看看。
加了if 之后就是把斜率限定在了10-30度这个范围。
由于你这个小斜线的斜率目测是这个范围,没有检测出来可能有如下两个原因:
1 你要检测的部分斜率不是10-30度
2 由于曲线不够直,导致检测的不是一条直线,而是很多零碎的线段。
测试方法:
通过绘制不同颜色的线段来观察是否是检测到得一条线段(还是很多线段连接成的一条曲线)
通过对 三个通道加不同的颜色来绘制。
uchar R=(rand() % 205) +50;
uchar G=(rand() % 205) +50;
uchar B=(rand() % 205) +50;
(产生从50-255的随机数)
修改后代买
lines = cvHoughLines2 (cannyImg, storage, CV_HOUGH_PROBABILISTIC,1,CV_PI/180, 10, 5, 10);
for (int i = 0; i < lines->total; i++){
CvPoint* line = (CvPoint*)cvGetSeqElem (lines, i);
double slope = ((double)(line[0].y - line[1].y))/((double)(line[0].x - line[1].x)); //斜率
if(atan(slope) > 10 && atan(slope) < 30){ //要在10-30度之间的直线
uchar R=(rand() % 205) +50;
uchar G=(rand() % 205) +50;
uchar B=(rand() % 205) +50;
cvLine (pImgDst, line[0], line[1], CV_RGB(R,G,B),2,8); //画出红色直线
}
}
结束之后贴结果,我给你继续解答
问清楚再给分啊。
根据你这个图我觉得用霍夫检测直线效果不好,晚上给你仔细看看。
加了if 之后就是把斜率限定在了10-30度这个范围。
由于你这个小斜线的斜率目测是这个范围,没有检测出来可能有如下两个原因:
1 你要检测的部分斜率不是10-30度
2 由于曲线不够直,导致检测的不是一条直线,而是很多零碎的线段。
测试方法:
通过绘制不同颜色的线段来观察是否是检测到得一条线段(还是很多线段连接成的一条曲线)
通过对 三个通道加不同的颜色来绘制。
uchar R=(rand() % 205) +50;
uchar G=(rand() % 205) +50;
uchar B=(rand() % 205) +50;
(产生从50-255的随机数)
修改后代买
lines = cvHoughLines2 (cannyImg, storage, CV_HOUGH_PROBABILISTIC,1,CV_PI/180, 10, 5, 10);
for (int i = 0; i < lines->total; i++){
CvPoint* line = (CvPoint*)cvGetSeqElem (lines, i);
double slope = ((double)(line[0].y - line[1].y))/((double)(line[0].x - line[1].x)); //斜率
if(atan(slope) > 10 && atan(slope) < 30){ //要在10-30度之间的直线
uchar R=(rand() % 205) +50;
uchar G=(rand() % 205) +50;
uchar B=(rand() % 205) +50;
cvLine (pImgDst, line[0], line[1], CV_RGB(R,G,B),2,8); //画出红色直线
}
}
结束之后贴结果,我给你继续解答
更多追问追答
追问
汗。。。已经解决了,是因为atan(slope)不能直接比较度数,要atan(slope)/CV_PI*180 这样才行,而且 取值范围也是 -PI/2 ~ PI/2 。。。改了以后就检测到了。。 已经送给回答的人300分了。= = 我是去回答手机提问抢的分,抢了2000多分了。
追答
咳咳咳,我仔细跟你说说吧!
说这个“取值范围也是 -PI/2 ~ PI/2”的回答者你可以直接打他脸了!!!
比如 y=x+1;
斜率是1,也就是slope是1;
但是你要知道,无论是tan和atan(tan反变换),求的结果都是极坐标下的theta值,而不是多少度!
那么 你atan(slope)的结果一定是求的是atan(1);
而 斜率为1对应的倾角是多少呢? 其实是结果为0.785,而不是45度,你用0.785和10度跟30度比较,结果肯定是错的!!!!
所以你要这么求角度,应该把弧度转为角度再和10跟30比较!!!
修改的if那行的程序应该是:
if((180*atan(slope)/3.14) > 10 && (180*atan(slope)/3.14) < 30)
根据那个不负责任的同学的解答,范围变成了-PI/2 ~ PI/2,也就是-90到90度,那么所有的线都会被检测出来,而不是你要的10-30度的结果!!!
欢迎追问!!!!!!!!
东莞大凡
2024-08-07 广告
2024-08-07 广告
OpenCV标定板是东莞市大凡光学科技有限公司在相机标定中常用的工具。它通常由黑白格点按一定规则排列在平面上组成,如棋盘格或圆形格等。在相机标定时,将标定板置于不同位置和姿态下拍摄图像,利用OpenCV库中的函数检测标定板上的角点或圆心,进...
点击进入详情页
本回答由东莞大凡提供
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询