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

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

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

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

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

(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

(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


(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

(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


(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

{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


(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);


(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);


(11)消除杂点并进行数字的识别


 


 

评论 95
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值