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;
}

效果: