您的位置:首页 > 运维架构

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

2011-07-02 15:47 274 查看
//需要的库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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: