【opencv入門篇】 10個程序快速上手opencv【上】

導言本系列博客目的在於可以在vs快速上手opencv,理論知識涉及較少,你們有興趣能夠查閱其餘博客深刻了解相關的理論知識,本博客後續也會對圖像方向的理論進一步分析,敬請期待:)html

PS:官方文檔永遠是最好的入門資料,逐步提升英文閱讀能力也很重要:)windows

官方文檔傳送門:函數

【英】http://www.docs.opencv.org/2.4.6/#學習

【中】http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/tutorials.htmlui

環境配置:http://www.cnblogs.com/always-chang/p/6170222.htmlspa

學習筆記思惟導圖:.net

一、第一個opencv程序——讀取一張照片
 1 #include "highgui.h" 
 2 
 3 int main(int argc, char** argv)
 4 {
 5     const char *imgpath = "opencv.jpg";
 6     IplImage *img = cvLoadImage(imgpath);//加載圖像文件至內存
 7     cvNamedWindow("Example1", CV_WINDOW_AUTOSIZE);//建立一個名爲Example1的窗口
 8     cvShowImage("Example1", img);//顯示圖像
 9     cvWaitKey(0);//等待用戶觸發按鍵
10     cvReleaseImage(&img);//釋放圖片佔用的內存
11     cvDestroyWindow("Example1");//銷燬窗口
12 
13     return 0;
14 }

注意:圖像在主函數所在文件夾。3d

運行結果:code

二、縮放圖片

主要函數介紹htm

1)cvResize

函數功能:圖像大小變換

函數原型:

voidcvResize(

  const CvArr* src,

  CvArr* dst,

  intinterpolation=CV_INTER_LINEAR

);

函數說明:

第一個參數表示輸入圖像。

第二個參數表示輸出圖像。

第三個參數表示插值方法,能夠有如下四種:

CV_INTER_NN - 最近鄰插值,

CV_INTER_LINEAR - 雙線性插值 (缺省使用)

CV_INTER_AREA - 使用象素關係重採樣。當圖像縮小時候,該方法能夠避免波紋出現。當圖像放大時,相似於 CV_INTER_NN 方法..

CV_INTER_CUBIC - 立方插值.

這個函數在功能上與Win32 API中的StretchBlt()函數相似。

2) cvCreateImage

函數功能:建立圖像

函數原型:

IplImage* cvCreateImage(CvSize size, intdepth,intchannels);

函數說明:

第一個參數表示圖像的大小。

第二個參數表示圖像的深度,能夠爲IPL_DEPTH_8U,IPL_DEPTH_16U等等。

第三個參數表示圖像的通道數

 

 1 #include <opencv2/opencv.hpp>  
 2 using namespace std;
 3 //隱藏控制檯窗口  
 4 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  
 5 int main()
 6 {
 7     const char *pstrImageName = "cyh.jpg";
 8     const char *pstrSaveImageName = "cyh縮放圖.jpg";
 9     const char *pstrWindowsSrcTitle = "原圖";
10     const char *pstrWindowsDstTitle = "縮放圖";
11 
12     double fScale = 0.5;      //縮放倍數  
13     CvSize czSize;              //目標圖像尺寸  
14 
15     //從文件中讀取圖像    
16     IplImage *pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_UNCHANGED);
17     IplImage *pDstImage = NULL;
18 
19     //計算目標圖像大小  
20     czSize.width = pSrcImage->width * fScale;
21     czSize.height = pSrcImage->height * fScale;
22 
23     //建立圖像並縮放  
24     pDstImage = cvCreateImage(czSize, pSrcImage->depth, pSrcImage->nChannels);
25     cvResize(pSrcImage, pDstImage, CV_INTER_AREA);
26 
27     //建立窗口  
28     cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
29     cvNamedWindow(pstrWindowsDstTitle, CV_WINDOW_AUTOSIZE);
30 
31     //在指定窗口中顯示圖像  
32     cvShowImage(pstrWindowsSrcTitle, pSrcImage);
33     cvShowImage(pstrWindowsDstTitle, pDstImage);
34 
35     //等待按鍵事件  
36     cvWaitKey();
37 
38     //保存圖片  
39     cvSaveImage(pstrSaveImageName, pDstImage);
40 
41     cvDestroyWindow(pstrWindowsSrcTitle);
42     cvDestroyWindow(pstrWindowsDstTitle);
43     cvReleaseImage(&pSrcImage);
44     cvReleaseImage(&pDstImage);
45     return 0;
46 }

輸出:

 

三、圖像邊緣提取

主要函數介紹

1) cvCanny

函數功能:採用Canny方法對圖像進行邊緣檢測

函數原型:

void cvCanny(

  const CvArr* image,

  CvArr* edges

  double threshold1,double threshold2,

  int aperture_size=3

);

函數說明:

第一個參數表示輸入圖像,必須爲單通道灰度圖。

第二個參數表示輸出的邊緣圖像,爲單通道黑白圖。

第三個參數和第四個參數表示閾值,這二個閾值中當中的小閾值用來控制邊緣鏈接,大的閾值用來控制強邊緣的初始分割即若是一個像素的梯度大與上限值,則被認爲是邊緣像素,若是小於下限閾值,則被拋棄。若是該點的梯度在二者之間則當這個點與高於上限值的像素點鏈接時咱們才保留,不然刪除。

第五個參數表示Sobel 算子大小,默認爲3即表示一個3*3的矩陣。Sobel 算子與高斯拉普拉斯算子都是經常使用的邊緣算子,詳細的數學原理能夠查閱專業書籍。

爲了更好的使用cvCanny()函數,下面再介紹二個實用的函數,這二個函數對後面的程序實現很是有幫助。

2)cvCreateTrackbar

函數功能:建立trackbar並添加到指定窗口

函數原型:

intcvCreateTrackbar(

  const char* trackbar_name,

  const char* window_name,

  int* value,

  intcount,

  CvTrackbarCallback on_change

);

函數說明:

第一個參數表示該trackbar的名稱。

第二個參數表示窗口名稱,該trackbar將顯示在這個窗口內。

第三個參數表示建立時滑塊的位置。

第四個參數表示滑塊位置的最大值,最小值固定爲0。

第五個參數表示回調函數。當滑塊位置有變化時,系統會調用該回調函數。

注:被建立的trackbar默認顯示在指定窗口的頂端,能夠經過函數cvGetTrackbarPos()來獲取trackbar顯示的位置信息,以及經過函數cvSetTrackbarPos()來從新設置trackbar的顯示位置。

 

3)CvTrackbarCallback

函數功能:cvCreateTrackbar()函數所使用的回調函數

函數定義:

typedef void (CV_CDECL *CvTrackbarCallback)(int pos)

函數說明:

當trackbar位置被改變的時,系統會調用這個回調函數,並將參數pos設置爲表示trackbar位置的數值。

 

 1 #include <opencv2/opencv.hpp>  
 2 using namespace std;
 3 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  
 4 
 5 IplImage *g_pSrcImage, *g_pCannyImg;
 6 const char *pstrWindowsCannyTitle = "邊緣檢測圖";
 7 //cvCreateTrackbar的回調函數  
 8 void on_trackbar(int threshold)
 9 {
10     //canny邊緣檢測  
11     cvCanny(g_pSrcImage, g_pCannyImg, threshold, threshold * 3, 3);
12     cvShowImage(pstrWindowsCannyTitle, g_pCannyImg);
13 }
14 int main()
15 {
16     const char *pstrImageName = "cyh.jpg";
17     const char *pstrWindowsGrayTitle = "灰度圖";
18     const char *pstrWindowsToolBar = "Threshold";
19 
20     //從文件中載入圖像的灰度圖CV_LOAD_IMAGE_GRAYSCALE - 灰度圖  
21     g_pSrcImage = cvLoadImage(pstrImageName, CV_LOAD_IMAGE_GRAYSCALE);
22     g_pCannyImg = cvCreateImage(cvGetSize(g_pSrcImage), IPL_DEPTH_8U, 1);
23 
24     //建立窗口  
25     cvNamedWindow(pstrWindowsGrayTitle, CV_WINDOW_AUTOSIZE);
26     cvNamedWindow(pstrWindowsCannyTitle, CV_WINDOW_AUTOSIZE);
27 
28     //建立滑動條  
29     int nThresholdEdge = 1;
30     cvCreateTrackbar(pstrWindowsToolBar, pstrWindowsCannyTitle, &nThresholdEdge, 100, on_trackbar);
31 
32     //在指定窗口中顯示圖像  
33     cvShowImage(pstrWindowsGrayTitle, g_pSrcImage);
34     on_trackbar(1);
35 
36     //等待按鍵事件  
37     cvWaitKey();
38 
39     cvDestroyWindow(pstrWindowsGrayTitle);
40     cvDestroyWindow(pstrWindowsCannyTitle);
41     cvReleaseImage(&g_pSrcImage);
42     cvReleaseImage(&g_pCannyImg);
43     return 0;
44 }

輸出:

 

四、圖像二值化

【多說幾句】灰度圖像和二值圖像

灰度圖像:從一個通道進行採樣獲得的圖像,這類圖像一般顯示爲從最暗黑色到最亮的白色的灰度(0~255)。灰度是指只含亮度信息,不含色彩信息的圖像。黑白照片就是灰度圖,特色是亮度由暗到明,變化是連續的。

使用灰度圖的好處:

①RGB的值都同樣。

②圖像數據即調色板索引值,就是實際的RGB值,也就是亮度值。

③由於是256色調色板,因此圖像數據中一個字節表明一個像素,很整齊。

  

二值圖像:圖像的二值化是將圖像上的像素點的灰度值設置爲0或255,也就是將整個圖像呈現出明顯的黑白效果。

將256個亮度等級的灰度圖像經過適當的閥值選取而得到仍然能夠反映圖像總體和局部特徵的二值化圖像。在數字圖像處理中,二值圖像佔有很是重要的地位,首先,圖像的二值化有利於圖像的進一步處理,使圖像變得簡單,並且數據量減少,能凸顯出感興趣的目標的輪廓。其次,要進行二值圖像的處理與分析,首先要把灰度圖像二值化,獲得二值化圖像。全部灰度大於或等於閥值的像素被斷定爲屬於特定物體,其灰度值爲255表示,不然這些像素點被排除在物體區域之外,灰度值爲0,表示背景或者例外的物體區域。

 主要函數介紹:

1)cvThreshold

函數功能:採用Canny方法對圖像進行邊緣檢測

函數原型:

void cvThreshold(

  const CvArr* src,

  CvArr* dst,

  double threshold,

  double max_value,

  int threshold_type

);

函數說明:

第一個參數表示輸入圖像,必須爲單通道灰度圖。

第二個參數表示輸出的邊緣圖像,爲單通道黑白圖。

第三個參數表示閾值

第四個參數表示最大值。

第五個參數表示運算方法。

在OpenCV的imgproc\types_c.h中能夠找到運算方法的定義。

/* Threshold types */

enum

{

    CV_THRESH_BINARY      =0,  /* value = value > threshold ? max_value : 0       */

    CV_THRESH_BINARY_INV  =1,  /* value = value > threshold ? 0 : max_value       */

    CV_THRESH_TRUNC       =2,  /* value = value > threshold ? threshold : value   */

    CV_THRESH_TOZERO      =3,  /* value = value > threshold ? value : 0           */

    CV_THRESH_TOZERO_INV  =4,  /* value = value > threshold ? 0 : value           */

    CV_THRESH_MASK        =7,

    CV_THRESH_OTSU        =8  /* use Otsu algorithm to choose the optimal threshold value; combine the flag with one of the above CV_THRESH_* values */

};

 

 1 #include <opencv2/opencv.hpp>  
 2 using namespace std;
 3 
 4 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")  
 5 
 6 IplImage *g_pGrayImage = NULL;
 7 IplImage *g_pBinaryImage = NULL;
 8 const char *pstrWindowsBinaryTitle = "二值圖";
 9 
10 void on_trackbar(int pos)
11 {
12     // 轉爲二值圖  
13     cvThreshold(g_pGrayImage, g_pBinaryImage, pos, 255, CV_THRESH_BINARY);
14     // 顯示二值圖  
15     cvShowImage(pstrWindowsBinaryTitle, g_pBinaryImage);
16 }
17 
18 int main(int argc, char** argv)
19 {
20     const char *pstrWindowsSrcTitle = "原圖";
21     const char *pstrWindowsToolBarName = "二值圖閾值";
22 
23     // 從文件中加載原圖  
24     IplImage *pSrcImage = cvLoadImage("cyh.jpg", CV_LOAD_IMAGE_UNCHANGED);
25 
26     // 轉爲灰度圖  
27     g_pGrayImage = cvCreateImage(cvGetSize(pSrcImage), IPL_DEPTH_8U, 1);
28     cvCvtColor(pSrcImage, g_pGrayImage, CV_BGR2GRAY);
29 
30     // 建立二值圖  
31     g_pBinaryImage = cvCreateImage(cvGetSize(g_pGrayImage), IPL_DEPTH_8U, 1);
32 
33     // 顯示原圖  
34     cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
35     cvShowImage(pstrWindowsSrcTitle, pSrcImage);
36     // 建立二值圖窗口  
37     cvNamedWindow(pstrWindowsBinaryTitle, CV_WINDOW_AUTOSIZE);
38 
39     // 滑動條    
40     int nThreshold = 1;
41     cvCreateTrackbar(pstrWindowsToolBarName, pstrWindowsBinaryTitle, &nThreshold, 100, on_trackbar);
42 
43     on_trackbar(1);
44 
45     cvWaitKey(0);
46 
47     cvDestroyWindow(pstrWindowsSrcTitle);
48     cvDestroyWindow(pstrWindowsBinaryTitle);
49     cvReleaseImage(&pSrcImage);
50     cvReleaseImage(&g_pGrayImage);
51     cvReleaseImage(&g_pBinaryImage);
52     return 0;
53 }

輸出:

 

opencv入門篇·上完。

新手上路,但願老司機能多多指教:)

 

本文參考:

http://blog.csdn.net/morewindows/article/category/1291764

http://blog.csdn.net/timidsmile/article/details/6681668

相關文章
相關標籤/搜索