此分類用於記錄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 }