//需要的库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; }