opencv 从摄像头读取检测直线(霍夫变化)

 
//需要的库cv210.lib cxcore210.lib highgui210.lib  cvcam.lib
#include "cv.h"               
#include "highgui.h"    
#include <math.h>
int main()    
{    
	//读取摄像头    
	//声明IplImage指针    
	IplImage* src_Img = NULL; 
	IplImage *edge_Img = NULL;
	IplImage *temp_Img = NULL;
	CvCapture* pCapture = cvCaptureFromCAM(-1); 
	CvMemStorage *storage=cvCreateMemStorage(0);//0 表示内存采用默认大小
	CvSeq * lines=NULL;

	//窗口通过窗口名来标识    
	cvNamedWindow("video", CV_WINDOW_AUTOSIZE);       
	bool isInitialize = false ;

	while(src_Img = cvQueryFrame( pCapture ))    
	{      
		if(!isInitialize)
		{
			edge_Img=cvCreateImage(cvGetSize(src_Img),IPL_DEPTH_8U,1);
			temp_Img=cvCreateImage(cvGetSize(src_Img),IPL_DEPTH_8U,1);
			isInitialize = true;
		}
		cvCvtColor(src_Img,temp_Img,CV_BGR2GRAY);//转为灰阶

		cvCanny(temp_Img,edge_Img,50,100);//边缘检测
        
		lines=cvHoughLines2(edge_Img,storage,CV_HOUGH_STANDARD,1,CV_PI/180,150);
		//------------------------------------------------------------------
		//	对于其中的一帧
		//------------------------------------------------------------------
		if(lines->total != 0)//检测到直线
		{
			printf("下面输出直线的一些位置\t\t线条数%d\n",lines->total/2);
			for (int i=0;i<MIN(lines->total,100);i++)
			{
				if(i%2 == 0)
					printf("下面输出线条%d的一些信息\n",i/2+1);
				float *line=(float *)cvGetSeqElem(lines,i);//lines是需要检测的序列,i是元素在序列中的索引
				float rho =line[0];
				float theta=line[1];
				printf("rho:%f,theta:%f\t",rho,theta);//注意坐标系采用图像坐标系,坐标原点在左上角

				double a=cos(theta),b=sin(theta);
				double x0=a*rho,y0=b*rho;
				CvPoint pt1,pt2;
				pt1.x=cvRound(x0 + 500*(-b));
				pt1.y=cvRound(y0 + 500*(a));
				pt2.x=cvRound(x0 - 500*(-b));
				pt2.y=cvRound(y0 - 500*(a));
				cvLine(src_Img,pt1,pt2,CV_RGB(255,0,0),1,CV_AA,0);

				printf("%f,%f\n",x0,y0);//如果点不在图像内,那么选在这条直线上离这个点最近的点开始画
			}  
			cvShowImage("video", src_Img);    
			//延时 ,不然不会显示图像的,应该是扫描太快了    
			cvWaitKey(10);  //不然会因为太快导致显示还没完九需要去显示下一帧,因此会显示nothing 

		}
		else//检测不到直线
			printf("图像中没有直线");
		//------------------------------------------------------------------
		//	执行以上的判断检测识别
		//------------------------------------------------------------------	   
	}    
	//释放图像    
	cvReleaseImage(&src_Img);  
	cvReleaseImage(&edge_Img);
	cvReleaseImage(&temp_Img);
	//销毁窗口    
	cvDestroyWindow("video");    
	//释放摄像设备    
	cvReleaseCapture(&pCapture);    
	return 0;     
}   

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值