最近接触图像处理,要实现数字万用表数据的自动读取。我使用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
//二值化图像
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
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
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);