//需要的库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;
}
opencv 从摄像头读取检测圆(霍夫变化)
最新推荐文章于 2023-02-20 09:00:00 发布