现在的位置: 首页 > 综合 > 正文

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

2013年10月13日 ⁄ 综合 ⁄ 共 1581字 ⁄ 字号 评论关闭
//需要的库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 * cir=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);//边缘检测
        
		cir=cvHoughCircles(temp_Img,storage,CV_HOUGH_GRADIENT,1,src_Img->width/10 ,80,40);
		//------------------------------------------------------------------
		//	对于其中的一帧
		//------------------------------------------------------------------
		if(cir->total != 0)
		{
			for (int i=0;i<MIN(cir->total,100);i++)
		{
			float * p=(float *)cvGetSeqElem(cir,i);

			CvPoint pt=cvPoint(cvRound(p[0]),cvRound(p[1]));

			cvCircle(src_Img,pt,cvRound(p[2]),CV_RGB(0,255,0));

			printf("圆心:X:%d,Y:%d",pt.x,pt.y);
			printf("半径:%d",p[2]);

		} 
			cvShowImage("video", src_Img);    
			//延时 ,不然不会显示图像的,应该是扫描太快了    
			cvWaitKey(10);  //不然会因为太快导致显示还没完九需要去显示下一帧,因此会显示nothing 

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

 

抱歉!评论已关闭.