1. 程式人生 > >OpenCV儀表資料識別(二):數字區域自動定位

OpenCV儀表資料識別(二):數字區域自動定位

下載和配置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