数字万用表(七段数码管)的图像识别(opencv实现)

时间:2021-11-27 20:29:56

        最近接触图像处理,要实现数字万用表数据的自动读取。我使用opencv+VC2005环境开发,OpenCV是Intel 开源计算机视觉库,它提供了强大的图像处理函数库。Opencv的介绍在这里太不多说,可以看看百度百科了解一下:http://baike.baidu.com/view/1343775.htm

        万用表的识别过程是先提取摄像头的一帧数据,然后对这幅图像做处理:

数字万用表(七段数码管)的图像识别(opencv实现)

(1)提取摄像头的一帧数据

	//读取摄像头一帧数据
	img0=cvQueryFrame(m_Video);

数字万用表(七段数码管)的图像识别(opencv实现)

(2)对图像进行平滑处理

cvSmooth(src_img, src_img,CV_GAUSSIAN, 5, 0);


(3)图像的灰度处理

	cvCvtColor(src_img, gray_img, CV_BGR2GRAY);

	//灰度图像
#ifdef SHOW_PROC_IMG
	cvNamedWindow(PIC_GLAY_WINDOW_NAME, CV_WINDOW_AUTOSIZE);
	cvShowImage(PIC_GLAY_WINDOW_NAME, gray_img);
#endif
数字万用表(七段数码管)的图像识别(opencv实现)

(4)对图像进行直方图均衡化处理

	IplImage* img_zf = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );
	cvEqualizeHist(gray_img, img_zf);

	cvReleaseImage(&gray_img);

#ifdef SHOW_PROC_IMG
	cvNamedWindow("直方图均衡化", CV_WINDOW_AUTOSIZE);
	cvShowImage("直方图均衡化", img_zf);
#endif

数字万用表(七段数码管)的图像识别(opencv实现)
(5)对图像进行二值化处理

	//二值化图像
	IplImage* pic2_img = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );

	cvThreshold(img_zf, pic2_img, 50, 255, CV_THRESH_BINARY_INV);
	cvReleaseImage(&img_zf);
#ifdef SHOW_PROC_IMG
	cvNamedWindow(PIC_2_WINDOW_NAME, CV_WINDOW_AUTOSIZE);
	cvShowImage(PIC_2_WINDOW_NAME, pic2_img);
#endif
数字万用表(七段数码管)的图像识别(opencv实现)

(6)细化处理

	IplImage* img3 = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );
	cvZero(img3);

	cvThin(pic2_img, img3, 5);//细化,通过修改iterations参数进一步细化
	cvReleaseImage(&pic2_img);
#ifdef SHOW_PROC_IMG
	cvNamedWindow("细化", CV_WINDOW_AUTOSIZE);
	cvShowImage("细化", img3);
#endif

数字万用表(七段数码管)的图像识别(opencv实现)
(7)图像腐蚀

	IplImage* img4 = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );
	

	/////图像腐蚀
#if 1
	cvErode(img3, img4, NULL, 1);
	cvReleaseImage(&img3);

#ifdef SHOW_PROC_IMG
	cvNamedWindow("图像腐蚀", CV_WINDOW_AUTOSIZE);
	cvShowImage("图像腐蚀", img4);	
#endif

数字万用表(七段数码管)的图像识别(opencv实现)

{8}图像膨胀

	///图像膨胀
	IplConvKernel *iplele = cvCreateStructuringElementEx(3, 3, 0, 0, CV_SHAPE_RECT);	

	cvDilate(img4, img4, iplele, 1);

	cvReleaseStructuringElement(&iplele);
	
#ifdef SHOW_PROC_IMG
	cvNamedWindow("图像膨胀", CV_WINDOW_AUTOSIZE);
	cvShowImage("图像膨胀", img4);
#endif

数字万用表(七段数码管)的图像识别(opencv实现)
(9)进一步细化处理

	IplImage* img3_2 = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );
	cvZero(img3_2);

	cvThin(img4, img3_2, 5);//细化,通过修改iterations参数进一步细化
	cvCopy(img3_2, img4);
	cvReleaseImage(&img3_2);

数字万用表(七段数码管)的图像识别(opencv实现)

(10)查找轮廓,进行数字分割

	IplImage* img5 = cvCreateImage( img_size, IPL_DEPTH_8U, 1 );
	cvCopy(img4, img5);

	CvSeq *contour = NULL;
	CvMemStorage* storage = cvCreateMemStorage(0);
	cvFindContours( img5, storage, &contour, sizeof(CvContour),CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);

	cvReleaseImage(&img5);

数字万用表(七段数码管)的图像识别(opencv实现)
(11)消除杂点并进行数字的识别

数字万用表(七段数码管)的图像识别(opencv实现)