最近接触图像处理,要实现数字万用表数据的自动读取。我使用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)消除杂点并进行数字的识别