opencv 學習
環境
VS2019
opencv4.4.0
參考:鏈接
初步嘗試
參考:鏈接
圖像顯示
#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; int main() { //讀取圖片 Mat img = imread("D:\\生活資料\\圖片\\斗圖\\1.jpg", 1); //圖片儲存位置地址使用 if (img.empty()) { std::cout << "圖片讀取失敗!" << std::endl; system("pause"); return 0; } imshow("【原圖】", img); //顯示原圖片 waitKey(); // 等待任意按鍵按下 return 0; }
顯示效果:
代碼解釋:
1、using namespace cv;
opencv 中的C++類和函數都是定義在命名空間cv之內的,在代碼開頭的適當位置加上 using namespace cv; ,規定程序位於此命名空間之內
2、Mat類
mat 類用於保存圖像以及其他矩陣數據的數據結構,我們這裡只是用到了 Mat img=imread();
3、imread()
imread() 函數用於讀取文件中的圖片到opencv中,定義如下:
Mat imread( const String& filename, int flags = IMREAD_COLOR );
第一個參數 const String& filename ,指的是圖片路徑,在Windows下,opencv的imread函數支持如下類型的圖像載入:
第二個參數: int flags = IMREAD_COLOR ,為載入表示,指定了一個加載圖像的顏色類型,其他不多介紹
4、imshow()
imshow()函數用於在指定的敞口中顯示衣服圖像,函數定義為:
void imshow(const String& winname, InputArray mat);
第一個參數:const String& winname,只要顯示的窗口顯示名稱
第二個參數:InputArray mat,只要顯示的圖像,其他不多介紹
圖形腐蝕和膨脹
腐蝕:就是圖像中暗色部分「腐蝕」掉圖像中的高亮部分
代碼:
#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; int main() { //讀取圖片 Mat img = imread("D:\\生活資料\\圖片\\斗圖\\1.jpg", 1); //圖片儲存位置地址使用 \\ if (img.empty()) { std::cout << "圖片讀取失敗!" << std::endl; system("pause"); return 0; } imshow("【原圖】", img); //顯示原圖片 //進行腐蝕操作 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); Mat dstimg; erode(img, dstimg, element); //顯示效果圖 imshow("【腐蝕操作】", dstimg); waitKey(); // 等待任意按鍵按下 return 0; }
效果:
代碼解釋:
參考:鏈接
1、getStructuringElement
getStructuringElement()函數,返回值為指定形狀和尺寸結構元素(內核矩陣),定義如下:
Mat getStructuringElement(int shape, Size ksize, Point anchor = Point(-1,-1));
第一個參數:內核的形狀(一般來說:矩形:MORPH_RECT;交叉形:MORPH_CROSS;橢圓形:MORPH_ELLIPSE)
第二個參數:內核大小(如上,就是15*15的正方行內核)
第三個參數:錨點的位置(默認值Point(-1,-1),表示錨點位於中心點)
2、erode
erode 函數使用像素鄰域內的局部極小運算符來腐蝕一張圖片,從src輸入,由dst輸出,定義如下:
void erode(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue()
);
第一個參數:輸入圖像,即源圖像,填Mat類的對象即可
第二個參數:目標圖像,需要有原圖像有一樣的尺寸和類型
第三個參數:kernel,腐蝕操作的內核,為NULL時,表示的是使用參考點位於中心3*3的核,一般使用 getStructuringElement 函數,會返回指定形狀和尺寸的結構元素(內核矩陣)
第四個參數:anchor,錨的位置,默認為(-1,-1),表示錨位於單位(element)的中心
第五個參數:iterations ,迭代使用erode函數的次數,默認為1
第六個參數:borderType ,用於推斷圖像外部像素的某種邊界模式,默認為BORDER_CONSTANT
第七個參數:borderValue,當邊界為常數時的邊界值,有默認值 morphologyDefaultBorderValue ,其他不多解釋
但使用erode函數,一般只需要前三個參數,後面四個參數都是默認值
膨脹:和腐蝕相反,將圖像亮度部分放大,黑暗部分縮小
代碼:
#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; int main() { //讀取圖片 Mat img = imread("D:\\生活資料\\圖片\\斗圖\\1.jpg", 1); //圖片儲存位置地址使用 \\ if (img.empty()) { std::cout << "圖片讀取失敗!" << std::endl; system("pause"); return 0; } imshow("【原圖】", img); //顯示原圖片 //進行腐蝕操作 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); Mat dstimg; dilate(img, dstimg, element); //顯示效果圖 imshow("【膨脹操作】", dstimg); waitKey(); // 等待任意按鍵按下 return 0; }
效果:
代碼分析:
1、dilate
dilate 函數使用像素鄰域內的局部極大運算符來膨脹一張圖片,從src輸入,由dst輸出,函數定義為:
void dilate(
InputArray src,
OutputArray dst,
InputArray kernel,
Point anchor = Point(-1,-1),
int iterations = 1,
int borderType = BORDER_CONSTANT,
const Scalar& borderValue = morphologyDefaultBorderValue()
);
參數介紹:
圖像模糊
模糊,就是對圖像進行了增值濾波操作
代碼:
#include <iostream> #include <opencv2/opencv.hpp> using namespace cv; int main() { //讀取圖片 Mat img = imread("D:\\生活資料\\圖片\\斗圖\\1.jpg", 1); //圖片儲存位置地址使用 \\ if (img.empty()) { std::cout << "圖片讀取失敗!" << std::endl; system("pause"); return 0; } imshow("【原圖】", img); //顯示原圖 Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); Mat dstimg; // 進行腐蝕操作 erode(img, dstimg, element); imshow("【腐蝕操作】", dstimg); // 進行膨脹操作 dilate(img, dstimg, element); imshow("【膨脹操作】", dstimg); // 進行模糊操作 blur(img, dstimg, Size(7, 7)); imshow("【均值濾波】", dstimg); waitKey(); // 等待任意按鍵按下 return 0; }
效果: