C++之OpenCV入門到提高002:載入、修改、儲存影像

可均可可發表於2024-10-29

一、介紹
    今天是這個系列《C++之 Opencv 入門到提高》得第二篇文章。今天這個篇文章很簡單,只是簡單介紹如何使用 Opencv 載入影像、顯示影像、修改影像和儲存影像,先給大家一個最直觀的感受。但是,不能認為很簡單,只是讓學習的過程更平滑一點,以後的路就好走了。OpenCV 具體的簡介內容,我就不多說了,網上很多,大家可以自行腦補。
    OpenCV 的官網地址:https://opencv.org/,元件下載地址:https://opencv.org/releases/
    OpenCV 官網學習網站:https://docs.opencv.ac.cn/4.10.0/index.html

    我需要進行說明,以防大家不清楚,具體情況我已經羅列出來。
        作業系統:Windows Professional 10(64位)
        開發元件:OpenCV – 4.10.0
        開發工具:Microsoft Visual Studio Community 2022 (64 位) - Current版本 17.8.3
        開發語言:C++(VC16)

二、知識講解
    由於今天的內容很簡單,就不過多的寫文字了,直接上程式碼,而且在程式碼中都進行了詳細的註釋,開始今天旅程吧。
    原始碼中有需要影像的,把地址換成自己的。

 1 #include <opencv2/opencv.hpp>
 2 #include <iostream>
 3 
 4 using namespace cv;
 5 using namespace std;
 6 
 7 /// <summary>
 8 /// 影像處理
 9 /// 1、載入影像        imread( const String& filename, int flags = IMREAD_COLOR )
10 /// 2、建立視窗        void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE)
11 /// 3、顯示影像        void imshow(const String& winname, InputArray mat)
12 /// 4、修改影像        void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 )
13 /// 5、儲存影像        imwrite( const String& filename, InputArray img,const std::vector<int>& params = std::vector<int>())
14 /// </summary>
15 /// <returns></returns>
16 int main()
17 {
18     //1、載入影像
19     //Mat imread( const String& filename, int flags = IMREAD_COLOR ):第一個引數是影像的地址,第二個引數載入影像的方式。
20     //IMREAD_UNCHANGED(<0)表示載入原圖,不做任何修改。
21     //IMREAD_GRAYSCALE(0)表示把原圖作為灰度影像載入進來。
22     //IMREAD_COLOR(>0)表示把原圖作為 RGB 影像載入進來。
23     // opencv 支援 jpg、png、tiff 等常見的影像格式。
24     Mat src = imread("D:\\360MoveData\\Users\\Administrator\\Desktop\\TestImage\\guanyu.jpg", IMREAD_UNCHANGED);
25 
26     //以灰度影像的方式載入原圖
27     Mat src2 = imread("D:\\360MoveData\\Users\\Administrator\\Desktop\\TestImage\\guanyu.jpg", IMREAD_GRAYSCALE);
28 
29     //2、建立視窗
30     //void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE):winname 表示視窗的名稱。flags 表示視窗的特性。
31     // namedWindow:表示建立一個指定名稱和特性的視窗,這個視窗用於顯示影像。它是由 OpenCV 自動建立和銷燬的,無需手動釋放。
32     //flags:視窗特性列表
33     //WINDOW_AUTOSIZE:自適應圖片大小,使用者無法修改視窗大小。
34     //WINDOW_FREERATIO:視窗大小自適應比例
35     //WINDOW_FULLSCREEN:全屏顯示
36     //WINDOW_GUI_NORMAL:是繪製視窗的舊方法沒有狀態列和工具欄,而WINDOW_GUI_EXPANDED是一個新的增強GUI。
37     //WINDOW_KEEPRATIO:保持影像的比例。
38     //WINDOW_NORMAL:跟 QT 整合的時候會使用,允許修改視窗大小。
39     //
40 
41     namedWindow("OrigianImage", WINDOW_AUTOSIZE);
42     namedWindow("GrayImage", WINDOW_AUTOSIZE);
43 
44     //3、顯示影像
45     //void imshow(const String& winname, InputArray mat):winname 使用 namedWindow 建立的視窗名稱;mat 要顯示的影像物件。
46     //imshow:使用 namedWindow 建立的視窗,顯示指定的影像。
47 
48     imshow("OrigianImage", src);
49     imshow("GrayImage", src2);
50 
51     //4、修改影像
52     //void cvtColor( InputArray src, OutputArray dst, int code, int dstCn = 0 ):src 源影像,需要轉換的影像;dst 色彩空間轉換後的影像;code 源色彩空間和目標色彩空間的轉換方式;dstCn 
53     //cvtColor:把影像從一個色彩空間轉化為另一個色彩空間。
54     //code 列表:
55     //COLOR_BGR2GRAY:從 RGB 轉化到 Gray,從彩色轉換為灰色。
56     //
57 
58     Mat des;
59     cvtColor(src, des, COLOR_BGR2HSV);
60 
61     namedWindow("cvtColorImage", WINDOW_AUTOSIZE);
62     imshow("cvtColorImage", des);
63 
64 
65     //5、儲存影像
66     //imwrite( const String& filename, InputArray img,const std::vector<int>& params = std::vector<int>()):filename 要儲存圖片的檔名稱,包含完整路徑和檔名和副檔名,副檔名不同,生成的影像也不同;img 要儲存的影像。
67     //imwrite:用於儲存為指定名稱的影像。
68     //只有8位、16位的 PNG、JPG、TIFF檔案格式而且是單通道或者是三通道的 BGR 的影像才可以透過這種方式儲存。
69     //儲存 PNG 格式的時候可以儲存透明通道的圖片。
70     //可以指定壓縮引數。
71 
72     //儲存三種格式,透過字尾名實現。
73     imwrite("D:\\ScanImages\\mypic.png",des);
74     imwrite("D:\\ScanImages\\mypic2.jpg", des);
75     imwrite("D:\\ScanImages\\mypic3.tif", des);
76 
77     waitKey(0);
78 
79     return 0;
80 }

    原圖程式碼:

1 Mat src = imread("D:\\360MoveData\\Users\\Administrator\\Desktop\\TestImage\\guanyu.jpg", IMREAD_UNCHANGED);
2 namedWindow("OrigianImage", WINDOW_AUTOSIZE);

3 imshow("OrigianImage", src);

    效果如圖:

    

    灰度影像的程式碼:

1 Mat src2 = imread("D:\\360MoveData\\Users\\Administrator\\Desktop\\TestImage\\guanyu.jpg", IMREAD_GRAYSCALE);
2 namedWindow("GrayImage", WINDOW_AUTOSIZE);
3 imshow("GrayImage", src2);

    灰度影像如圖:

    

    改變色彩空間的程式碼:

1 Mat des;
2 cvtColor(src, des, COLOR_BGR2HSV);
3 
4 namedWindow("cvtColorImage", WINDOW_AUTOSIZE);
5 imshow("cvtColorImage", des);

    效果如圖:

    

    其他的就不多說了,內容很簡單。



三、總結
    這是 C++ 使用 OpenCV 的第二篇文章,其實也沒那麼難,感覺是不是還是很好入門的,那就繼續。初見成效,繼續努力。皇天不負有心人,不忘初心,繼續努力,做自己喜歡做的,開心就好。

相關文章