opencv 簡單、經常使用的圖像處理函數(2)

1.vc++配置opencvhtml

2.簡單經常使用的圖片處理函數java

3.圖像修復函數python

 

opencv的項目以來配置和環境變量的配置都很簡單,對於我這個沒有c++基礎的來講,複雜的是opencv的api和一些大部分來自國外沒有翻譯的資料,以及一些常見的編碼問題。c++

資料

opencv 中文apiapi

博客園tornadomeet的opencv學習筆記數組

opencv安裝目錄詳解

opencv安裝完成後並配置好vc++項目後,先不要急着去按照書本上的例子打代碼,這裏 咱們介紹一下opencv的安裝目錄,目錄中有很詳盡的功能解決方案,可讓咱們在快速學習或項目時能夠很方便找到相應功能的大致實現思路,因此瞭解opencv的安裝目錄,會加快咱們學習的進度和對總體邏輯的理解。app

下面簡單介紹一下opencv的安裝目錄,以opencv2.4.13爲例dom

opencv的安裝根目錄,其中build文件夾爲配置項目時的依賴文件,這裏在配置時,用處有大致的瞭解函數

以上是build文件夾中的文件tornado

doc:生成文檔所需的源文件以及輔助腳本

include:opencv引用的源碼

java、python:java、python的引用文件

shard:opencv公用的數據文件,xml格式

x6四、x86:不通系統下的依賴文件(3二、64位操做系統)

以上文件是sources文件夾中的文件,是在opencv中比較有趣和讓人興奮的一部分。

3rdparty:包含第三方的庫,好比視頻解碼用的 ffmpeg,jpg、png、tiff等圖片的開源解碼庫。

apps:包含進行 haar 分類器訓練的工具,opencv 進行人臉檢測即是基於 haar 分類器。若是你想檢測人臉之外的圖片,千萬不要錯過這幾個工具。

cmake:包含生成工程項目時 cmake 的依賴文件,用於智能搜索第三方庫,普通開發者不須要關心這個文件夾的內容。

data:包含 opencv 庫以及範例中用到的資源文件,haar 物體檢測的分類器位於haarcascades子文件中。

doc:包含生成文檔所需的源文件以及輔助腳本。

include:源碼文件夾

modules:核心模塊源碼

platforms:包含交叉編譯所需的工具鏈以及額外的代碼,交叉編譯指的是在一個操做系統中編譯供另外一個系統使用的文件。

samples:這個是我最喜歡的一個文件夾了,裏面是代碼的示例。

opencv圖像處理

1.打開圖片

//聲明IplImage指針
IplImage * pImg;
//判斷載入圖像是否成功
if(pImg = cvLoadImage("image url",0/1/-1)!=0){
    //建立窗口
    cvNamedWindow("Image",1);
    //顯示圖像
    cvShowImage("Image",pImg);
    //等待按鍵
    cvWaitKey(-1);
    //銷燬窗口
    cvDestoryWindow("Image");
    //釋放圖像
    cvReleaseImage(&pImg);
}

使用函數及參數說明:

cvLoadIamge(fileName,flags);   fileName:要被讀入的文件的文件名(包括後綴) flags:讀入圖像的顏色和深度(flags=-1默認圖像的原通道;flags=0強制轉化爲灰度圖像;flags=1讀取色彩圖)

cvNamedWindow(windowName,flags);windowName:表示建立的窗口名稱;flags:窗口屬性(flags=0用戶能夠手動更改圖像尺寸;flags=1用戶不可編輯圖像尺寸)

cvWaitKey(delay);函數的功能是不斷刷新圖像,頻率時間爲delay,單位爲ms。

cvDestroyWindow(windowName);銷燬指定名字的窗口。windowName:被銷燬的窗體名稱

cvReleaseImage(image);釋放圖像資源

2.拷貝保存圖像

    //打開圖像
    IplImage* pImg = createImage();
    //根據打開的圖像建立圖像
    IplImage * pImg2 = cvCreateImage(cvGetSize(pImg), pImg->depth, pImg->nChannels);
    //拷貝圖像
    cvCopy(pImg, pImg2, NULL);
    //設置該圖像保存目錄
    cvSaveImage("image uri", pImg2);
    //釋放該圖片資源
    cvReleaseImage(&pImg2);

使用函數及參數說明:

cvCopy:拷貝一個數組給另外一個數組。

cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL )

src:輸入數組。
dst:輸出數組。
mask:操做掩碼是8比特單通道的數組,它指定了輸出數組中被改變的元素。

3.圖像縮放

    //聲明兩個圖片指針
    IplImage* src = 0;//源圖
    IplImage* dst = 0;//新圖
    float scale = 0.218;//縮放比例    取值0~1  源圖比例爲1
    CvSize dst_cvsize;  //新圖尺寸

    //判斷路徑圖片是否存在 並賦值給src對象
    if ((src = cvLoadImage("E:\\tiger.jpg")) != 0){
        //根據scale參數設置新圖寬高
        dst_cvsize.width = src->width * scale;
        dst_cvsize.height = src->height * scale;
        //以dst_cvsize 建立圖片 並指向新圖指針
        dst = cvCreateImage(dst_cvsize, src->depth, src->nChannels);
        //縮放源圖至目標圖
        cvResize(src,dst,CV_INTER_LINEAR);

        //建立圖像窗口
        cvNamedWindow("src image window",CV_WINDOW_AUTOSIZE);
        cvNamedWindow("dst image window", CV_WINDOW_AUTOSIZE);

        //顯示兩張圖片
        cvShowImage("src image window",src);
        cvShowImage("dst image window", dst);

        //等待用戶響應
        cvWaitKey(-1);

        //釋放指針內存
        cvReleaseImage(&src);
        cvReleaseImage(&dst);

        //銷燬全部窗口資源
        cvDestroyAllWindows();

 

使用函數及參數說明:

cvResize:從新調整圖像src(或它的ROI),使它精確匹配目標dst(或其ROI)。這裏須要說明的是,cvResize能夠用來調整3通道圖像(如RGB圖像)和單通道圖像的大小。

cvResize( const CvArr* src, CvArr* dst, int interpolation=CV_INTER_LINEAR )

src: 源圖像
dst :目標圖像
interpolation 修改、插補的方法,取值以下:
·CV_INTER_NN - 最近-鄰居插補
·CV_INTER_LINEAR - 雙線性插值(默認方法)
·CV_INTER_AREA - 像素面積相關重採樣。當縮小圖像時,該方法能夠避免波紋的出現。當放大圖像時,相似於方法CV_INTER_NN。(It is the preferred method for image decimation that gives moire-free results. In case of zooming it is similar to CV_INTER_NN method. )
·CV_INTER_CUBIC -雙三次插值

 

alpha混合 透明度 

  IplImage*src1, *src2;
    if ((src1 = cvLoadImage("image1 url", 1)) != 0 && (src2 = cvLoadImage("image2 url", 1)) != 0)
    {
        int x = 20;
        int y = 20;
        int width = 200;
        int height = 200;
        double alpha = 0.9;
        double beta = 0.1;
        cvSetImageROI(src1, cvRect(x, y, width, height));
        cvSetImageROI(src2, cvRect(x, y, width, height));
        
        cvAddWeighted(src1, alpha, src2, beta, 0.0,src1 );
        cvResetImageROI(src1);
        cvNamedWindow("alpha_blend", 1);
        cvShowImage("alpha_blend", src1);
        cvWaitKey();
    }

使用函數及參數說明:

cvAddWeighted:分割多通道數組成幾個單通道數組或者從數組中提取一個通道。

cvAddWeighted( const CvArr* src1, double alpha, const CvArr* src2, double beta, double gamma, CvArr* dst );

各個變量的意義:
  src1 //第一個原數組. 
  alpha //第一個數組元素的權值 
  src2 //第二個原數組 
  beta //第二個數組元素的權值 
  dst //輸出數組 
  gamma //添加的常數項。 
  函數 cvAddWeighted 計算兩數組的加權值的和: 
  dst(I)=src1(I)*alpha+src2(I)*beta+gamma 
  全部的數組必須有相同的類型相同的大小(這裏是在學習時比較不易懂的地方,我理解其意思是,在操做的兩個原數組的屬性融合時,其值的和要和單一原數組的屬性值相等,不然將會拋出異常 )。

 代碼解讀:

1.聲明兩個圖像指針,經過cvLoadImage函數爲其指定圖片路徑,並判斷其圖片讀取合法性。

2.cvSetImageTOI函數標定cvRect函數所指定的座標大小區域。

3.針對於操做區域進行圖像的融合。

4.顯示圖像。

 

相關文章
相關標籤/搜索