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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZhtSunday/article/details/51931772

下载和配置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.处理结果

result

猜你喜欢

转载自blog.csdn.net/ZhtSunday/article/details/51931772