作业帮 > 综合 > 作业

opencv怎么分别计算两条线段?

来源:学生作业帮 编辑:搜搜考试网作业帮 分类:综合作业 时间:2024/06/24 04:26:04
opencv怎么分别计算两条线段?
for (int i = 0; i < lines->total; i++){  
    \x05\x05CvPoint* line = (CvPoint*)cvGetSeqElem (lines,i); 
    \x05\x05double slope = ((double)(line[0].y - line[1].y))/((double)(line[0].x - line[1].x));
    \x05\x05if(atan(slope)/CV_PI*180 > -20 && atan(slope)/CV_PI*180 < -5){
         cvLine (pImgDst,line[0],line[1],CV_RGB(255,0,0),2,8);
    \x05\x05}
\x05}

用霍夫变换找到的两条线段,然后用CVLINE画了出来. 我想请问一下,怎么才能分别得到这两条线段的端点的位置呢?


line[0].x line[1].x 是线段两点的x坐标,但是现在是两条线段 ,不是很清楚,应该怎么区分.而且这两条红色线段是可能上下左右移动的.
opencv怎么分别计算两条线段?
我的一点想法:因为是多条线段,将你找到的线段用矩形轮廓包围起来,逐点扫描,利用灰度阈值(因为你已经用红色标示,我建议使用R通道)找出该矩形区域内所有灰度级别在阈值内的点,根据X坐标和Y坐标就可判断首尾坐标,因为是直线,那么x坐标最小的肯定是首,x坐标最大的肯定是尾嘛!可以自己在坐标纸上试着研究一下!逻辑上很简单的.但是我觉得霍夫变换肯定已经可以直接输出坐标了,只是你没找到对应的参数而已,否则你这条线断不可能画得出来,也就是说坐标其实已经计算了,只需要你输出就可以了.
再问: 。。。霍夫变换肯定是找到了 ,但是在一个循环里,我也不知道怎么把两条线段的两个端点给分出来。
再答: 我在看了一下你上面的这段代码,你的CvPoint* line不就是线段的首尾点,这个for循环就是画线段,当i=0的时候是第一条线段,而此时由CvPoint* line = (CvPoint*)cvGetSeqElem (lines, i); 得到的结构体存储的就是首尾点,你加断点调试一下,看一下程序执行到这里的输出,我敢断定就是你要的首尾坐标。不好意思,昨天没仔细看你的程序。
再问: 才发现,其实我在判断的时候就已经找到两个线段的端点了。 还有个问题,为什么画面上显示的红线,时长时短,总是在变动,为什么不是固定的????
再答: lines->total是你找到的线段的总条数,你先看一下总共有多少条,我觉得你的图像并不只是两条线段,你是想把倾斜角度在某个范围内的线段画出来。其实光从你这一小段程序我也看不出来什么,仅从这段程序来看,不应该出现这种情况才对。信息量太少!!!!
再问: cvCanny(test2, cannyImg, 50, 200, 3); lines = cvHoughLines2 (cannyImg, storage, CV_HOUGH_PROBABILISTIC,1,CV_PI/180, 10, 5, 20); //霍夫变换 看了一下total 是 35 。。。然后又测了几次,发现total的数字不固定,29,33,32 都有
再答: 怎么会这样,按理说同一张图片每次检测的应该一样的呀!你说的线段变动问题应该有两种可能:1.就是霍夫直线检测出来的直线变动,导致你最终画出来的直线不一样,这样的几率个人认为比较小,你可以用输出的坐标计算一下线段长度,然后将霍夫直线检测的阈值设定比它大,看一下是否还能画出直线,若能的话就不是这个问题,若不能的话那就是这里出问题了。2.就是问题并不是出在这里,而是在你最终的显示上面,你说每次显示都一样,但是每次都是两条线段,我觉得就有点诡异了。最好把你整个代码都给我看一下。
再问: 。。。。不是同一张图片啊,是视频实时监测,是用摄像头照的。但是我摄像头没移动够,线段就是在一直变动。 我是想通过两次截图,然后把图中两条线段中一个端点的x,y坐标求出来,直接想减就行了。然后就把移动的距离求出来了。 貌似是我弄错了。我应该把两张截图二值化后,再做一次霍夫变换,这样就能求出两条线段位置了。然后再相减。。。感觉好麻烦。
再答: 你的目的是要求出目标的位移,线段只是你的一个位标,那随意抽取两帧就好了,两帧抽取出来后就是单纯图像而不是视频,应该不是很复杂才对。你可以用第一幅图像检测出来的直线(这条线段你随意指定好了,最好用特征比较明显的线段,比如长度最长,或者倾斜角度最大)特征作为条件去匹配第二张图像的线段,这些特征包括长度,斜率等等。这样的话可能好一点,找出对应的线段编号(也就是i,j的值)之后坐标已经知道了,移动就位移好求了。