您的位置:首页 > 运维架构

OpenCV仪表数据识别(二):数字区域自动定位

2016-07-17 12:34 507 查看
下载和配置Opencv在网上和书上有很多的讲解,这里不再赘述。

此处附上Opencv的下载链接

想要对图片中的数字信息进行识别首先要对图片进行预处理,排除干扰的因素,只留下有价值的信息。

这里需要两张图,一张为有数据的图片,一张为仪表关闭时没有数据的图片





1.原理

仪表数字和背景的区别就是数据会在短时间内会发生变化,这样在差分二值图中未变化的背景区域就会被滤除。

2.函数说明

1.
cvAbsDiff(const CvArr* scr1, const CvArr* scr2, CvArr *dst)


功能:求两个图片(两帧)的差值

参数1:源图片1,单通道灰度图

参数2:源图片2,单通道灰度图

参数3:目标图像,得到的差值图存在*dst中

2.
cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR )


功能:加载图片

参数1:源图片地址

参数2:加载图片的属性

常用:

CV_LOAD_IMAGE_UNCHANGED 图像保持原有属性

CV_LOAD_IMAGE_COLOR 载入图像为三通道

3.
cvCreateImage(CvSize size, int depth, int channels)


功能:创建图片

参数1:图片宽、高

参数2:图片深度

IPL_DEPTH_8U - 无符号8位整型

IPL_DEPTH_8S - 有符号8位整型

IPL_DEPTH_16U - 无符号16位整型

IPL_DEPTH_16S - 有符号16位整型

IPL_DEPTH_32S - 有符号32位整型

IPL_DEPTH_32F - 单精度浮点数

IPL_DEPTH_64F - 双精度浮点数

参数3:一个元素的通道数(1、2、3)

4.
cvCvtColor( const CvArr* src, CvArr* dst, int code )


功能:颜色转换

参数1:源图片

参数2:目标图片

参数3:转换模式

CV_BGR2GRAY 转换为灰度图 (des是单通道图片)

5.
cvThreshold( const CvArr* src, CvArr* dst, double threshold, double max_value, int threshold_type )


功能:图片二值化(只有黑色和白色)

参数1:src 源图片,单通道灰度图

参数2:dst 目标图片,单通道灰度图

参数3:threshold 阈值

参数4:max_value 使用 CV_THRESH_BINARY 和 CV_THRESH_BINARY_INV 的最大值。

参数5:threshold_type 阈值类型

CV_THRESH_BINARY =0 大于阈值的像素设为最大值,小于阈值的设为最小值

CV_THRESH_BINARY_INV =1 大于阈值的像素设为最小值,小于阈值的像素设为最大值

CV_THRESH_TRUNC =2 大于阈值的像素设为阈值,小于阈值的像素保持原色

CV_THRESH_TOZERO =3 大于阈值的像素保持原值,小于阈值的像素设为0

CV_THRESH_TOZERO_INV=4 大于阈值的像素设为0,小于阈值的像素保持原值

3.代码

#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

//建立指针
//源图像:
IplImage *SrcImage1=NULL, *SrcImage2=NULL;
//二值图:
IplImage *BinaryImage=NULL;
//灰度图:
IplImage *GrayImage1=NULL, *GrayImage2=NULL, *GrayImage3=NULL;
//源图片加载地址
const char *SrcImageName1="C:\\picture\\biao1.jpg";
const char *SrcImageName2="C:\\picture\\biao2.jpg";
//图片储存地址
const char *SaveBinaryPath="C:\\picture\\binary1.jpg";
//图像窗口名称
const char *BinaryWindowName="二值图";

int main()
{
//读取原图
SrcImage1=cvLoadImage(SrcImageName1,CV_LOAD_IMAGE_UNCHANGED);
SrcImage2=cvLoadImage(SrcImageName2,CV_LOAD_IMAGE_UNCHANGED);

//创建灰度图
GrayImage1=cvCreateImage(cvGetSize(SrcImage1),IPL_DEPTH_8U,1);
GrayImage2=cvCreateImage(cvGetSize(SrcImage2),IPL_DEPTH_8U,1);
GrayImage3=cvCreateImage(cvGetSize(SrcImage1),IPL_DEPTH_8U,1);
//变成灰度图
cvCvtColor(SrcImage1,GrayImage1,CV_BGR2GRAY);
cvCvtColor(SrcImage2,GrayImage2,CV_BGR2GRAY);

//检测差值
cvAbsDiff(GrayImage1,GrayImage2,GrayImage3);

//创建二值图
BinaryImage=cvCreateImage(cvGetSize(GrayImage3),IPL_DEPTH_8U,1);
//图像二值化
cvThreshold(GrayImage3,BinaryImage,35,255,CV_THRESH_BINARY);
//创建窗口
cvNamedWindow(BinaryWindowName,CV_WINDOW_AUTOSIZE);
//显示
cvShowImage(BinaryWindowName,BinaryImage);
//保存
cvSaveImage(SaveBinaryPath,BinaryImage);
//等待按键事件
cvWaitKey();
//释放
cvDestroyWindow(BinaryWindowName);
cvReleaseImage(&SrcImage1);
cvReleaseImage(&SrcImage2);
cvReleaseImage(&BinaryImage);
cvReleaseImage(&GrayImage1);
cvReleaseImage(&GrayImage2);
cvReleaseImage(&GrayImage3);
return 0;
}


4.处理结果

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息