OpenCV學習(1)--圖像的讀取、寫入、輸出、ROI的選取、Mat介紹


此分類用於記錄OpenCV的學習,目前隨筆中給出的代碼都是用C++寫的,后面可能會用上Python。

另外學習過程的記錄會放在代碼塊的注釋中。

學習資料 OpenCV官方文檔

OpenCV讀取圖像數據並輸出

對於OpenCV中的圖像,以左上角為(0, 0)點,橫軸為x,縱軸為y,即對於圖像來說,y表示有多少rows,x表示有多少cols

 1 void readAndShow(string path) {
 2     string imageName(path);
 3     cv::Mat image;
 4     // cv::Mat 包括一個矩陣頭和一個指向存儲像素值區域的指針
 5     // Mat的復制 只復制矩陣頭和指針 圖像數據不會復制成第二份 
 6     // 類似於 Type *A = B 此時改變B也會改變A 淺拷貝
 7 
 8     // 要復制圖像數據時 需要使用一下兩種方式
 9     // cv::Mat image2 = image.clone();
10     // A.copyTo(image2)
11 
12     //image = imread(imageName, cv::IMREAD_COLOR);  // 讀取圖像文件
13     //image = imread(imageName, cv::IMREAD_GRAYSCALE);
14     image = cv::imread(imageName, cv::IMREAD_COLOR);
15 
16     // imread() 第一個參數為圖像文件所在路徑 第二個參數指定我們所需的圖像格式
17     // IMREAD_COLOR (<0)按原樣加載圖像
18     // IMREAD_GRAYSCALE (0) 加載灰度圖像
19     // IMREAD_COLOR (>0) 以RGB格式加載圖像
20 
21 
22     if (image.empty()) {   // 讀取未成功
23         cout << "Failed read!" << std::endl;
24         return;
25     }
26 
27     cv::namedWindow("Display window", cv::WINDOW_AUTOSIZE);   // 創建window 參數"Display window"指定窗口名稱
28     cv::imshow("Display window", image);  // 在窗口顯示圖片
29     cv::waitKey(0);  // 等待一個鍵盤輸入
30     return;
31 }

將讀入的彩色圖片轉化為灰度圖片並寫入磁盤

 1 void showCvtColorAndImwrite(string path) {
 2     cv::Mat image;
 3     image = cv::imread(path, cv::IMREAD_COLOR);  // 讀取RGB格式彩色圖片
 4 
 5     if (image.empty()) {
 6         cout << "Failed read!" << endl;
 7         return;
 8     }
 9 
10     cv::namedWindow("RGBColor", cv::WINDOW_AUTOSIZE);
11     cv::imshow("RGBColor", image);
12     cv::waitKey(0);
13 
14     // 轉換為灰度圖片
15     cv::Mat grayImage;
16     cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);  
17     // 將彩色圖片轉化為灰度圖片 image為原彩色圖片數據 grayImage為轉化后存儲灰色圖片數據的地方 cv::COLOR_BGR2GRAY指示執行怎么樣的轉換
18 
19     cv::namedWindow("grayColor", cv::WINDOW_AUTOSIZE);
20     cv::imshow("grayColor", grayImage);
21 
22     cv::imwrite("first_gray.jpg", grayImage);   
23     // 將garyImage存儲的圖片數據寫入磁盤 新寫入的圖片文件名為first_gray.jpg
24     cv::waitKey(0);
25 }

在圖像中創建感興趣區域 ROI

 1 int selectROIExample(void) {
 2     // 在原讀取的圖像文件中選取了一個990*990大小的矩陣ROI 並輸出
 3     cv::Mat image;
 4     image = cv::imread("first.jpg", cv::IMREAD_COLOR);
 5 
 6     if (image.empty()) {   // 讀取未成功
 7         cout << "Failed read!" << std::endl;
 8         return 0;
 9     }
10 
11     cv::Mat D(image, cv::Rect(10, 10, 1000, 1000));
12     // 選取image中左上角為(10, 10)長寬為(1000, 1000)的矩形包含的圖像
13     // 即在圖像中創建感興趣區域 ROI
14 
15     cv::namedWindow("Test Window!", cv::WINDOW_AUTOSIZE);
16     cv::imshow("Test Window!", image);
17     cv::waitKey(0);
18     cv::imshow("Test Window!", D);
19     cv::waitKey(0);
20     return 0;
21 }

Mat的創建

 1 void howToCreateMatSubject() {
 2     // Mat的初始化構造
 3 
 4     cv::Mat image(100, 100, CV_8UC3, cv::Scalar(0, 0, 255));
 5     // 通過給定圖像大小100*100 
 6     // 指定存儲元素的數據類型和每個矩陣點的通道數CV_8UC3即8位無符號char類型3通道
 7     // 通過Scalar將圖像設置為單一灰度Scalar(num)或顏色Scalar(n1, n2, n3)
 8 
 9     int size[3] = { 200, 200, 200 };
10     cv::Mat image2(3, size, CV_8UC(1), cv::Scalar::all(0));
11     // 創建一個2維已上的矩陣
12     // 參數3指定維度
13     // size 指定每個維度的大小
14 
15     /*
16     MATLAB樣式的初始化器
17     cv::Mat::zeros()
18     cv::Mat::ones()
19     cv::Mat::eye()
20     */
21 
22     // cv::randu() 獲取隨機值
23 
24     // cv::format()控制輸出格式 cv::Formatter::FMT_NUMPY表示以numpy形式
25     // std::cout << "控制輸出格式" << std::endl << cv::format(image, cv::Formatter::FMT_NUMPY) << std::endl;
26 
27     cv::Point2f P(5, 1);
28     //
29 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM