Opencv4基于C++基礎入門筆記:圖像 顏色 事件響應 圖形 視頻 直方圖

?效果圖??????:opencv人臉識別效果圖(請叫我真愛粉)

先看一下效果圖勾起你的興趣!?

文章目錄:

一:環境配置搭建

二:圖像

1.圖像讀取與顯示

main.cpp?

運行結果

2.圖像色彩空間轉換

2.1 換色彩?

test.h?

test.cpp

main.cpp??

?運行結果

2.2 照片換背景

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

3.圖像對象的創建Mat

test.h

test.cpp?

main.cpp

運行結果

4.圖像像素?

4.1 圖像像素的讀寫

test.h? ? ? ?

test.cpp? ?

main.cpp? ? ?

運行結果

4.2 圖像像素的算術操作

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

4.3?圖像像素的邏輯操作(或 與 非 異或)

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

4.4 圖像像素值統計

test.h

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

4.5 圖像像素類型的轉換與歸一化

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

5.圖像通道分離與合并與混合

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

6.圖像的放縮與差值

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

7.圖像的旋轉

7.1 定義好的角度

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果

7.2 自定義角度

原理?

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

8.圖像模糊

8.1 圖像卷積操作

test.h

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

8.2 高斯模糊

test.h

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

8.3 高斯雙邊模糊

test.h

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

三:顏色

1.顏色表操作

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

2.隨機數與隨機顏色

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

四:事件響應?

1.滾動條?

1.1 滾動條調整圖像亮度

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ?

1.2 滾動條參數傳遞(亮度和對比度)

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

2.鍵盤響應

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

3.鼠標響應

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

五:圖形

1.圖像幾何形狀繪制

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

2.多邊形填充與繪制

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

六:視頻

1.視頻文件攝像頭使用

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

2.視頻處理與保存

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

七:直方圖

1.圖像的直方圖

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

2.二維2D直方圖

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

3.直方圖的均衡化

test.h? ? ? ?

test.cpp? ? ? ?

main.cpp? ? ? ?

運行結果? ? ? ?

Opencv4基于C++的 實時人臉檢測


來源:?OpenCV4 C++ 快速入門視頻30講 - 系列合集 10小時? ? ? ? 資源-sorce-cpp

評價

講的如何?老師講的很好,有干貨!看這門課最好有點點基礎,沒有基礎細心的花點時間仔細學也是可以看懂的!啟示?作為入門課程,的確可以打開我們一些眼界,有點新鮮有點意思!我的筆記:(含注解,知識點分類)我是怎么學的?我是零基礎,基本上先看代碼,自己一行一行的看,不懂的看老師怎么講,再百度看那個?看筆記看test.cpp就可以了,里面都是正在的封裝功能函數每個知識點可以干什么?我都運行出來了,可以更加直觀的看效果    學多久?別看這個課時10來個小時,但是下載軟件配置環境,理解代碼敲代碼我花了2.5天,如果你們不敲代碼可能就會快很多的!        

我的代碼:點我查看?

學習路線?

入門:OpenCV圖象讀寫、視頻讀寫、基本像素處理、色彩空間轉化初級:OpenCV圖象卷積處理、二值圖象分析、形態學處理、視頻分析中級:OpenCV圖象特征提取與應用、深度神經網絡,機器學習高級:Pytorch深度學習、OpenVINO開發、torchvision對象檢測框架tensorflow對象檢測框架、模型從設計、訓練、部署

一:環境配置搭建

OpenCV4基于C++基礎入門筆記:OpenCV環境配置搭建

進入“資源屬性管理器如”何返回“解決方案資源管理器”?點擊窗口——>重置窗口布局——>是注    釋: CTRL+K+C 
取消注釋: CTRL+K+U

二:圖像

1.圖像讀取與顯示

main.cpp?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow#include<opencv2/opencv.hpp>
#include<iostream>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_GRAYSCALE);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");	return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果

2.圖像色彩空間轉換

2.1 換色彩?

test.h?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge); 
};

test.cpp

這里需要包含工程的目錄:點擊工程名TestOpenCV右鍵屬性——>VC++目錄——>包含目錄F:\VC2015\TestOpenCV\TestOpenCV

#include<test.h>//色彩轉換
void QuickDemo::colorSpace_Demo(Mat & image)
{Mat a, b;								//定義2個矩陣類的圖像a和b,cvtColor(image, b, COLOR_BGR2HSV);		//圖像轉換函數,可以把image轉成b,第三個參數是轉成的類型	COLOR_BGR2HSV  = 40BGR到HSVcvtColor(image, a, COLOR_BGR2GRAY);		//圖像轉換函數,可以把image轉成a,第三個參數是轉成的類型	COLOR_BGR2GRAY = 6彩色到灰度imshow("HSV", b);imshow("灰度", a);//保存圖片,前面是保存圖的地址,后面是保存圖的名稱imwrite("F:/images/hsv.jpg", b);					imwrite("F:/images/gray.jpg", a);
}

main.cpp??

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度       黑色輪廓線條(細致)//COLOR_GRAY2BGR = 8灰度到彩色    //COLOR_BGR2HSV  = 40BGR到HSV        黑白摳圖 //COLOR_HSV2BGR  = 54HSV到BGR        黑色輪廓線條(粗略)//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換qd.colorSpace_Demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

?運行結果

2.2 照片換背景

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//圖像色彩空間轉換//RGB色彩空間//HSV色彩空間//YUV色彩空間//YCrCb色彩空間//色彩空間轉換:cvtColor(輸入圖像,輸出圖像,轉換的顏色空間類型)//提取指定色彩范圍區域:inRange(輸入圖像,最小值,最大值,提取指定范圍的像素)void QuickDemo::inrange_demo(Mat &image)							//可以替換照片背景,可以從ps相關來理解
{Mat hsv;cvtColor(image, hsv, COLOR_BGR2HSV);							//色彩空間轉換Mat mask;//自己的照片背景顏色【去除】//inRange(hsv, Scalar(35, 43, 46), Scalar(77, 255, 255), mask);	//綠色inRange(hsv, Scalar(100, 43, 46), Scalar(124, 255, 255), mask);	//綠色imshow("mask", hsv);			//原圖Mat redback = Mat::zeros(image.size(), image.type());//需要替換的背景顏色【替換】//redback = Scalar(40, 40, 200);	//紅色redback = Scalar(230, 20, 20);		//藍色bitwise_not(mask, mask);		//取反 黑白版圖(根據顏色去背景):去掉背景色(無顏色)+摳出人物(人物顏色不一樣)imshow("mask", mask);	image.copyTo(redback, mask);	//蒙版之后的圖:換背景=背景顏色+人物圖實圖								imshow("roi區域提取", redback);	
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換qd.inrange_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

3.圖像對象的創建Mat

test.h

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);
};

test.cpp?

#include<test.h>//圖像對象的創建
void QuickDemo::mat_creation_demo(Mat &image)
{Mat m1, m2;m1 = image.clone();image.copyTo(m2);		//復制//創建空白圖像		ones&zeros是初始化的方法Mat m3 = Mat::ones(Size(400,400), CV_8UC3);	//創建400*400;的CV8位的;無符號uU=nsigned char;通道為n=3數據的寬度和長度是由通道數決定的m3 = Scalar(255, 0, 0);//改變m3的顏色為藍色//用來查看寬度,高度與通道數/*std::cout << "width:"<<m3.cols<<"height"<< m3.rows <<"channels"<<m3.channels()<< std::endl;std::cout << m3 << std::endl;*/Mat m4 = m3.clone();	 //克隆//m3.copyTo(m4);		 //把M3賦值給M4,M4就是藍色m4 = Scalar(0, 255, 255);//改變m4的顏色為黃色//這里還有其他的//Mat m3 = m4;		//賦值//Mat kernel = (Mat_<char>(3,3) << 0, -1, 0,-1,5,-1,0,-1,-1 );imshow("圖像3", m3);	//標題和圖像名稱   顯示圖像m3 純藍色imshow("圖像4", m4);	//標題和圖像名稱
}

main.cpp

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建qd.mat_creation_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果

4.圖像像素?

4.1 圖像像素的讀寫

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針
};

test.cpp? ?

#include<test.h>//圖像像素的讀寫	第一種是數組訪問模式
void QuickDemo::pixel_visit_demo1(Mat &image)
{int dims = image.channels();int h = image.rows;int w = image.cols;for (int row = 0; row < h; row++){for (int col = 0; col < w; col++){if (dims == 1) //單通道的灰度圖像{int pv = image.at<uchar>(row, col);  //得到像素值image.at<uchar>(row, col) = 255 - pv;//給像素值重新賦值}if (dims == 3) //三通道的彩色圖像{Vec3b bgr = image.at<Vec3b>(row, col);		//opencv特定的類型,獲取三維顏色,3個值image.at<Vec3b>(row, col)[0] = 255 - bgr[0];image.at<Vec3b>(row, col)[1] = 255 - bgr[1];image.at<Vec3b>(row, col)[2] = 255 - bgr[2];//對彩色圖像讀取它的像素值,并且對像素值進行改寫。}}}namedWindow("像素讀寫演示", WINDOW_FREERATIO);imshow("像素讀寫演示", image);
}//圖像像素的讀寫	第二種為指針訪問模式
void QuickDemo::pixel_visit_demo2(Mat &image)
{int dims = image.channels();int h = image.rows;int w = image.cols;for (int row = 0; row < h; row++){uchar *current_row = image.ptr<uchar>(row);for (int col = 0; col < w; col++){if (dims == 1) //單通道的灰度圖像{int pv = *current_row;	   //得到像素值*current_row++ = 255 - pv; //給像素值重新賦值}if (dims == 3) //三通道的彩色圖像{*current_row++ = 255 - *current_row; //指針每做一次運算,就向后移動一位*current_row++ = 255 - *current_row;*current_row++ = 255 - *current_row;}}}namedWindow("像素讀寫演示", WINDOW_FREERATIO);imshow("像素讀寫演示", image);}

main.cpp? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組qd.pixel_visit_demo2(src);	//指針waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果

4.2 圖像像素的算術操作

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//圖像像素的算術操作
void QuickDemo::operators_demo(Mat &image)
{Mat dst = Mat::zeros(image.size(), image.type());Mat m   = Mat::zeros(image.size(), image.type());dst = image - Scalar(50, 50, 50);	//素點減50m = Scalar(50, 50, 50);//下面是內部的函數調用add(image, m, dst);				//加法操作 apiimshow("加法操作", dst);namedWindow("加法操作", WINDOW_FREERATIO);//subtract(image, m, dst);		//減法操作 api//imshow("減法操作", dst);//multiply(image, m, dst);		//乘法操作 api//imshow("乘法操作", dst);//divide(image, m, dst);		//除法操作 api//imshow("除法操作", dst);//	//加法操作底層
//	int dims = image.channels();
//	int h = image.rows;
//	int w = image.cols;
//	for (int row = 0; row < h; row++)
//	{
//		for (int col = 0; col < w; col++)
//		{
//			Vec3b p1 = image.at<Vec3b>(row, col); //opencv特定的類型,獲取三維顏色,3個值
//			Vec3b p2 = m.at<Vec3b>(row, col);
//			dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(p1[0] + p2[0]);	//saturate_cast用來防爆,小于0就是0,大于255就是255
//			dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(p1[1] + p2[1]);
//			dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(p1[2] + p2[2]);	//對彩色圖像讀取它的像素值,并且對像素值進行改寫。
//		}
//	}
//	imshow("加法操作", dst);
//
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作qd.operators_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

?

4.3?圖像像素的邏輯操作(或 與 非 異或)

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//圖像像素的邏輯操作
void QuickDemo::bitwise_demo(Mat &image)
{Mat m1 = Mat::zeros(Size(256, 256), CV_8UC3);Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);//圖像,形狀大小位置,顏色,線寬(>0表示繪制 <0表示填充),線條樣式,逆時針方向//顏色B G Rrectangle(m1, Rect(100, 100, 80, 80), Scalar(255, 255, 0), -1, LINE_8, 0);rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);imshow("m1", m1);imshow("m2", m2);Mat dst;bitwise_and(m1, m2, dst);	//位操作與bitwise_or(m1, m2, dst);	//位操作或bitwise_not(image, dst);	//取反操作bitwise_xor(m1, m2, dst);	//異或操作imshow("像素位操作", dst);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作qd.bitwise_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

?

4.4 圖像像素值統計

test.h

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//圖像像素值統計//最小(min)//最大(max)//均值(mean)//標準方差(standard deviation)//最大最小值minMaxLoc//計算均值與標準方差meanStdDevvoid QuickDemo::pixel_statistic_demo(Mat &image)
{double minv, maxv;			//定義最值Point minLoc, maxLoc;		//定義最值地址std::vector<Mat>mv;			//mv是一個Mat類型的容器 裝在這個容器內split(image, mv);for (int i = 0; i < mv.size(); i++){//求出圖像的最大值和最小值minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());	std::cout << "通道:" << i << "最小值:" << minv << "最大值:" << maxv << std::endl;}Mat mean, stddev;//求出圖像的均值和方差Mat redback = Mat::zeros(image.size(), image.type());/*	redback = Scalar(40, 40, 200);meanStdDev(redback, mean, stddev);imshow("redback", redback);*/meanStdDev(image, mean, stddev);	std::cout << "均值:" << mean << std::endl;std::cout << "方差:" << stddev << std::endl;
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計qd.pixel_statistic_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

4.5 圖像像素類型的轉換與歸一化

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);//鼠標操作與響應void QuickDemo::mouse_drawing_demo(Mat &image);//圖像像素類型的轉換與歸一化void QuickDemo::norm_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//圖像像素類型的轉換與歸一化//將圖像或圖像中的某個區域(如ROI)的像素值范圍縮放到0到1之間,或者根據需要縮放到指定的范圍//這是一種常用的圖像預處理步驟,可以用于圖像的對比度拉伸、色彩均衡、直方圖均衡化等操作//歸一化類型有四種,分別是NORM_L2、NORM_L1、NORM_INF、NORM_MINMAX12//	NORM_L2:默認值。計算L2范數,使用歐幾里得距離//	NORM_L1:計算L1范數,即絕對值之和//	NORM_INF:計算最大元素的絕對值//	NORM_MINMAX:將像素值縮放到[0, 1]的范圍內
void QuickDemo::norm_demo(Mat &image)
{Mat dst;//打印出來圖片的類型std::cout << image.type() << std::endl;	//將dst數據轉換成浮點型float32位數據image.convertTo(image, CV_32F);std::cout << image.type() << std::endl;//圖像進行歸一化操作:輸入圖像,輸出圖像,縮放因子-通常取值為1.0,偏移量-通常取值為0.0,歸一化的類型normalize(image, dst, 1.0,0.0, NORM_MINMAX);std::cout << dst.type() << std::endl;imshow("圖像的歸一化", dst);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制//qd.polyline_drawing_demo(src);//鼠標操作與響應//qd.mouse_drawing_demo(src);//圖像像素類型的轉換與歸一化qd.norm_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

5.圖像通道分離與合并與混合

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//通道的分離與合并
void QuickDemo::channels_demo(Mat &image)
{//容器std::vector<Mat>mv;//1.通道分離split(image, mv);//0,1,2三個通道分別代表BGR//imshow("藍色", mv[0]);//imshow("綠色", mv[1]);//imshow("紅色", mv[2]);Mat dst;//選擇一個通道打開,其他關閉mv[0] = 0;mv[2] = 0;//2.通道合并merge(mv, dst);imshow("藍色", dst);//3.通道混合int from_to[] = { 0,2,1,1,2,0 };				//兩兩依次一組mixChannels(&image, 1, &dst, 1, from_to, 3);	//3表示3個通道imshow("通道混合", dst);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并qd.channels_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

6.圖像的放縮與差值

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);//鼠標操作與響應void QuickDemo::mouse_drawing_demo(Mat &image);//圖像像素類型的轉換與歸一化void QuickDemo::norm_demo(Mat &image);//圖像的放縮與差值void QuickDemo::resize_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//圖像的放縮與差值
void QuickDemo::resize_demo(Mat &image)
{Mat zoomin, zoomout;int h = image.rows;int w = image.cols;//調整大小的圖像,是否需要縮小圖像,新的圖像大小,在縮小圖像時要在哪個位置開始采樣,在縮小圖像時要在哪個位置開始采樣,插值方法//resize(image, zoomin, Size(w/2, h/2), 0, 0, INTER_LINEAR);//imshow("zoomin", zoomin);resize(image, zoomout, Size(w*3 , h*3), 0, 0, INTER_LINEAR);imshow("zoomin", zoomout);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制//qd.polyline_drawing_demo(src);//鼠標操作與響應//qd.mouse_drawing_demo(src);//圖像像素類型的轉換與歸一化//qd.norm_demo(src);//圖像的放縮與差值qd.resize_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

?

7.圖像的旋轉

7.1 定義好的角度

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);//鼠標操作與響應void QuickDemo::mouse_drawing_demo(Mat &image);//圖像像素類型的轉換與歸一化void QuickDemo::norm_demo(Mat &image);//圖像的放縮與差值void QuickDemo::resize_demo(Mat &image);//圖像的旋轉:定義好的void QuickDemo::flip_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//圖像的旋轉:定義好的
void QuickDemo::flip_demo(Mat &image)
{Mat dst;flip(image, dst, 0);//上下翻轉 x對稱flip(image, dst, 1);//左右翻轉 y對稱flip(image, dst, -1);//旋轉180°imshow("圖像翻轉", dst);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制//qd.polyline_drawing_demo(src);//鼠標操作與響應//qd.mouse_drawing_demo(src);//圖像像素類型的轉換與歸一化//qd.norm_demo(src);//圖像的放縮與差值//qd.resize_demo(src);//圖像的旋轉:定義好的qd.flip_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果

7.2 自定義角度

原理?

旋轉矩陣的第三個元素是0,這是因為在2D平面中進行旋轉時,圖像在Z軸上的位置沒有變化?

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);//鼠標操作與響應void QuickDemo::mouse_drawing_demo(Mat &image);//圖像像素類型的轉換與歸一化void QuickDemo::norm_demo(Mat &image);//圖像的放縮與差值void QuickDemo::resize_demo(Mat &image);//圖像的旋轉:定義好的void QuickDemo::flip_demo(Mat &image);//圖像的旋轉:自定義void QuickDemo::rotate_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//圖像的旋轉:自定義
void QuickDemo::rotate_demo(Mat &image)
{Mat dst, M;			//用于存儲旋轉后的圖像和旋轉矩陣int h = image.rows;	//定義輸入圖片的高度int w = image.cols;	//定義輸入圖片的寬度//旋轉矩陣//2D旋轉的變換矩陣:圖像的中心點,旋轉的角度(單位是度),旋轉的縮放因子(1.0表示不進行縮放)M = getRotationMatrix2D(Point(w / 2, h / 2), 45, 1.0);//矩陣旋轉獲取角度	旋轉矩陣是一個2x3的矩陣//旋轉矩陣的第三個元素是0,這是因為在2D平面中進行旋轉時,圖像在Z軸上的位置沒有變化//[cos(angle)   sin(angle)  0]//[-sin(angle)  cos(angle)  0]// 獲取旋轉矩陣的第一行第一列元素的絕對值,即cos(45度)double cos = abs(M.at<double>(0, 0));	// 獲取旋轉矩陣的第一行第二列元素的絕對值,即sin(45度)double sin = abs(M.at<double>(0, 1));//這里怎么算的:我放了張圖// 根據旋轉矩陣的元素計算旋轉后的圖像的寬度,等于cos(45度)*原寬度+sin(45度)*原高度int nw = cos * w + sin * h;// 根據旋轉矩陣的元素計算旋轉后的圖像的高度,等于sin(45度)*原寬度+cos(45度)*原高度int nh = sin * w + cos * h;// 將旋轉矩陣的第三列的第一項加上(旋轉后的圖像寬度的一半減去原圖像寬度的一半),以調整旋轉后的圖像的中心位置M.at<double>(0, 2) += (nw / 2 - w / 2);// 將旋轉矩陣的第三列的第二項加上(旋轉后的圖像高度的一半減去原圖像高度的一半),以調整旋轉后的圖像的中心位置M.at<double>(1, 2) += (nh / 2 - h / 2);//圖像進行放射變換:輸入圖像,輸出圖像,仿射變換矩陣(決定了圖像的變換方式),輸出圖像的大小,雙線性插值法,無填充(0表示無顏色合成),填充顏色warpAffine(image, dst, M, Size(nw, nh), INTER_LINEAR, 0, Scalar(255, 255, 0));imshow("旋轉演示", dst);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制//qd.polyline_drawing_demo(src);//鼠標操作與響應//qd.mouse_drawing_demo(src);//圖像像素類型的轉換與歸一化//qd.norm_demo(src);//圖像的放縮與差值//qd.resize_demo(src);//圖像的旋轉:定義好的//qd.flip_demo(src);//圖像的旋轉:自定義qd.rotate_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

8.圖像模糊

blur圖像模糊、GaussianBlur高斯模糊和bilateralFilter的高斯雙邊模糊區別:blur				圖像模糊:即普通的模糊,對圖像進行相同像素之間的融合,得到整個圖像都模糊的效果GaussianBlur		高斯模糊:圖像整體都變模糊,邊緣信息丟失嚴重bilateralFilter 高斯雙邊模糊:圖像邊緣清晰,中間部分有一定程度的模糊,邊緣信息得以保留

8.1 圖像卷積操作

test.h

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);//鼠標操作與響應void QuickDemo::mouse_drawing_demo(Mat &image);//圖像像素類型的轉換與歸一化void QuickDemo::norm_demo(Mat &image);//圖像的放縮與差值void QuickDemo::resize_demo(Mat &image);//圖像的旋轉:定義好的void QuickDemo::flip_demo(Mat &image);//圖像的旋轉:自定義void QuickDemo::rotate_demo(Mat &image);//視頻文件攝像頭使用void QuickDemo::video_demo1(Mat &image);//視頻處理與保存void QuickDemo::video_demo2(Mat &image);//圖像直方圖void QuickDemo::histogram_demo(Mat &image);//二維直方圖void QuickDemo::histogram_2d_demo(Mat &image);//直方圖的均衡化void QuickDemo::histogram_eq_demo(Mat &image);//圖像卷積操作void QuickDemo::blur_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//圖像卷積操作
void QuickDemo::blur_demo(Mat &image) {Mat dst;//原始圖像,卷積之后的圖像,卷積的矩陣大小,卷積的起始點blur(image, dst, Size(15, 15), Point(-1, -1));imshow("圖像卷積操作 圖像模糊", dst);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制//qd.polyline_drawing_demo(src);//鼠標操作與響應//qd.mouse_drawing_demo(src);//圖像像素類型的轉換與歸一化//qd.norm_demo(src);//圖像的放縮與差值//qd.resize_demo(src);//圖像的旋轉:定義好的//qd.flip_demo(src);//圖像的旋轉:自定義//qd.rotate_demo(src);//視頻文件攝像頭使用//qd.video_demo1(src);//視頻處理與保存//qd.video_demo2(src);//圖像直方圖//qd.histogram_demo(src);//二維直方圖//qd.histogram_2d_demo(src);//直方圖的均衡化//qd.histogram_eq_demo(src);//圖像卷積操作qd.blur_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

8.2 高斯模糊

test.h

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);//鼠標操作與響應void QuickDemo::mouse_drawing_demo(Mat &image);//圖像像素類型的轉換與歸一化void QuickDemo::norm_demo(Mat &image);//圖像的放縮與差值void QuickDemo::resize_demo(Mat &image);//圖像的旋轉:定義好的void QuickDemo::flip_demo(Mat &image);//圖像的旋轉:自定義void QuickDemo::rotate_demo(Mat &image);//視頻文件攝像頭使用void QuickDemo::video_demo1(Mat &image);//視頻處理與保存void QuickDemo::video_demo2(Mat &image);//圖像直方圖void QuickDemo::histogram_demo(Mat &image);//二維直方圖void QuickDemo::histogram_2d_demo(Mat &image);//直方圖的均衡化void QuickDemo::histogram_eq_demo(Mat &image);//圖像卷積操作void QuickDemo::blur_demo(Mat &image);//高斯模糊void QuickDemo::gaussian_blur_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//高斯模糊
void QuickDemo::gaussian_blur_demo(Mat &image) {Mat dst;//初始圖像,處理后的圖像,高斯矩陣大小,sigmaX在X方向上的標準偏差-控制了模糊的程度和模糊的方向//較大的sigmaX值會導致更寬的模糊效果,而較小的值則會產生更銳利的模糊效果GaussianBlur(image, dst, Size(0, 0), 15);imshow("高斯模糊", dst);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制//qd.polyline_drawing_demo(src);//鼠標操作與響應//qd.mouse_drawing_demo(src);//圖像像素類型的轉換與歸一化//qd.norm_demo(src);//圖像的放縮與差值//qd.resize_demo(src);//圖像的旋轉:定義好的//qd.flip_demo(src);//圖像的旋轉:自定義//qd.rotate_demo(src);//視頻文件攝像頭使用//qd.video_demo1(src);//視頻處理與保存//qd.video_demo2(src);//圖像直方圖//qd.histogram_demo(src);//二維直方圖//qd.histogram_2d_demo(src);//直方圖的均衡化//qd.histogram_eq_demo(src);//圖像卷積操作//qd.blur_demo(src);//高斯模糊qd.gaussian_blur_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

8.3 高斯雙邊模糊

test.h

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);//鼠標操作與響應void QuickDemo::mouse_drawing_demo(Mat &image);//圖像像素類型的轉換與歸一化void QuickDemo::norm_demo(Mat &image);//圖像的放縮與差值void QuickDemo::resize_demo(Mat &image);//圖像的旋轉:定義好的void QuickDemo::flip_demo(Mat &image);//圖像的旋轉:自定義void QuickDemo::rotate_demo(Mat &image);//視頻文件攝像頭使用void QuickDemo::video_demo1(Mat &image);//視頻處理與保存void QuickDemo::video_demo2(Mat &image);//圖像直方圖void QuickDemo::histogram_demo(Mat &image);//二維直方圖void QuickDemo::histogram_2d_demo(Mat &image);//直方圖的均衡化void QuickDemo::histogram_eq_demo(Mat &image);//圖像卷積操作void QuickDemo::blur_demo(Mat &image);//高斯模糊void QuickDemo::gaussian_blur_demo(Mat &image);//高斯雙邊模糊void QuickDemo::bifilter_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//高斯雙邊模糊
void QuickDemo::bifilter_demo(Mat &image) {Mat dst;//輸入圖像,輸出圖像,濾波過程中像素之間的距離,顏色空間中的標準偏差,像素空間中的標準偏差bilateralFilter(image, dst, 0, 100, 10);imshow("高斯雙邊模糊", dst);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制//qd.polyline_drawing_demo(src);//鼠標操作與響應//qd.mouse_drawing_demo(src);//圖像像素類型的轉換與歸一化//qd.norm_demo(src);//圖像的放縮與差值//qd.resize_demo(src);//圖像的旋轉:定義好的//qd.flip_demo(src);//圖像的旋轉:自定義//qd.rotate_demo(src);//視頻文件攝像頭使用//qd.video_demo1(src);//視頻處理與保存//qd.video_demo2(src);//圖像直方圖//qd.histogram_demo(src);//二維直方圖//qd.histogram_2d_demo(src);//直方圖的均衡化//qd.histogram_eq_demo(src);//圖像卷積操作//qd.blur_demo(src);//高斯模糊//qd.gaussian_blur_demo(src);//高斯雙邊模糊qd.bifilter_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

三:顏色

1.顏色表操作

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//opencv自帶顏色操作
void QuickDemo::color_style_demo(Mat &image)
{//各種色彩int colormap[] = {COLORMAP_AUTUMN ,COLORMAP_BONE,COLORMAP_CIVIDIS,COLORMAP_DEEPGREEN,COLORMAP_HOT,COLORMAP_HSV,COLORMAP_INFERNO,COLORMAP_JET,COLORMAP_MAGMA,COLORMAP_OCEAN,COLORMAP_PINK,COLORMAP_PARULA,COLORMAP_RAINBOW,COLORMAP_SPRING,COLORMAP_TWILIGHT,COLORMAP_TURBO,COLORMAP_TWILIGHT,COLORMAP_VIRIDIS,COLORMAP_TWILIGHT_SHIFTED,COLORMAP_WINTER};Mat dst;int index = 0;while (true){char c = waitKey(100);		//停頓100ms 做視頻處理都是1if (c == 27) {			    //esc 退出應用程序break;}if (c == 49)				//key#1 按下按鍵1時,保存圖片到指定位置{std::cout << "你按下了 #1" << std::endl;imwrite("F:/images/gray.jpg", dst);}applyColorMap(image, dst, colormap[index % 19]);	//循環展示19種圖片	(輸入圖像,輸出圖像,匹配顏色)index++;imshow("循環播放", dst);}
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作qd.color_style_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

顏色不停自動變換?

?

2.隨機數與隨機顏色

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();};

test.cpp? ? ? ?

#include<test.h>//隨機數與隨機顏色
void QuickDemo::random_drawing()
{Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);int w = canvas.cols;int h = canvas.rows;//初始化RNG rng(2);while (true){int c = waitKey(10);if (c == 27){break;}//rng.uniform(low, high)將生成一個在范圍[low, high)內的均勻分布的隨機數int x1 = rng.uniform(0, canvas.cols);int y1 = rng.uniform(0, h);int x2 = rng.uniform(0, canvas.cols);int y2 = rng.uniform(0, h);int b = rng.uniform(0, 255);int g = rng.uniform(0, 255);int r = rng.uniform(0, 255);canvas = Scalar(0, 0, 0);line(canvas, Point(x1, y1), Point(x2, y2), Scalar(b, g, r), 8, LINE_AA, 0);	imshow("隨機繪制演示", canvas);}
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色qd.random_drawing();waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

不停移動變換顏色?

四:事件響應?

1.滾動條?

1.1 滾動條調整圖像亮度

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo(Mat &image);
};

test.cpp? ? ? ?

#include<test.h>//滾動條調整圖像亮度
Mat  src, dst, m;
int lightness = 50;								//定義初始的亮度為50
static void on_track(int, void*)
{m = Scalar(lightness, lightness, lightness);//創建調整亮度的數值subtract(src, m, dst);						//定義亮度變化為——減imshow("亮度調整", dst);					//顯示調整亮度之后的圖片
}
void QuickDemo::tracking_bar_demo(Mat &image)
{namedWindow("亮度調整", WINDOW_AUTOSIZE);dst = Mat::zeros(image.size(), image.type());//圖片的初始化創建一個和image大小相等,種類相同的圖像m = Mat::zeros(image.size(), image.type());//圖片的初始化創建一個和image大小相等,種類相同的圖像src = image;								 //給src賦值int max_value = 100;						 //定義最大值為100createTrackbar("Value Bar:", "亮度調整", &lightness, max_value, on_track);//調用函數實現功能。on_track(50, 0);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度qd.tracking_bar_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ?

?

1.2 滾動條參數傳遞(亮度和對比度)

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//滾動條參數傳遞(亮度和對比度)
static void on_lightness(int b, void* userdata)//亮度 目標圖像
{Mat image = *((Mat*)userdata);Mat dst = Mat::zeros(image.size(), image.type());Mat m = Mat::zeros(image.size(), image.type());m = Scalar(b, b, b);//第一個圖像 第一個圖像的權重 第二個圖像 第二個圖像的權重 加到權重總和上的標量值 目標圖像addWeighted(image, 1.0, m, 0, b, dst);		//融合兩張圖imshow("亮度&對比度調整", dst);
}
static void on_contrast(int b, void* userdata)  //對比度 目標圖像
{Mat image = *((Mat*)userdata);Mat dst = Mat::zeros(image.size(), image.type());Mat m = Mat::zeros(image.size(), image.type());double contrast = b / 100.0;addWeighted(image, contrast, m, 0.0, 0, dst);//融合兩張圖imshow("亮度&對比度調整", dst);
}
void QuickDemo::tracking_bar_demo2(Mat &image)
{namedWindow("亮度&對比度調整", WINDOW_AUTOSIZE);int lightness = 50;int max_value = 100;int contrast_value = 100;//				 取名			窗口名			滑塊初始值  滾動的最大值 接收回調函數  用戶傳給回調函數的數據createTrackbar("Value Bar:", "亮度&對比度調整", &lightness, max_value, on_lightness, (void*)(&image));createTrackbar("Contrast Bar:", "亮度&對比度調整", &contrast_value, 200, on_contrast, (void*)(&image));on_lightness(50, &image);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)qd.tracking_bar_demo2(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

2.鍵盤響應

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//鍵盤響應
void QuickDemo::key_demo(Mat &image)	//先要鼠標點擊圖片再按鍵盤
{Mat dst = Mat::zeros(image.size(), image.type());while (true){char c = waitKey(100);//停頓100ms 做視頻處理都是1if (c == 27) {		  //esc 退出應用程序break;}if (c == 49)//key#1{std::cout << "你按下了 #1" << std::endl;cvtColor(image, dst, COLOR_BGR2GRAY);}if (c == 50)//key#2{std::cout << "你按下了 #2" << std::endl;cvtColor(image, dst, COLOR_BGR2HSV);}if (c == 51)//key#3{std::cout << "你按下了 #3" << std::endl;dst = Scalar(50, 50, 50);add(image, dst, dst);}imshow("鍵盤響應", dst);std::cout << c << std::endl;}
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應qd.key_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

?

?

3.鼠標響應

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);//鼠標操作與響應void QuickDemo::mouse_drawing_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//鼠標操作與響應Point sp(-1, -1);//鼠標的開始的位置Point ep(-1, -1);//鼠標放下的位置Mat temp;//處理繪圖事件:事件,x 和 y表示鼠標的坐標位置,標志或狀態信息,指向用戶數據的指針
static void on_draw(int event, int x, int y, int flags, void *userdata)
//event:表示發生的事件類型
//	EVENT_MOUSEMOVE(鼠標移動)
//	EVENT_LBUTTONDOWN(鼠標左鍵按下)
//	EVENT_RBUTTONDOWN(鼠標右鍵按下)
{//獲取用戶數據Mat image = *((Mat*)userdata);if (event == EVENT_LBUTTONDOWN)		//如果鼠標的左鍵按下   顯示起點	{sp.x = x;sp.y = y;std::cout << "起點" << sp << std::endl;}else if (event == EVENT_LBUTTONUP)	//鼠標左鍵彈起事件		在新窗口顯示圖{ep.x = x;ep.y = y;int dx = ep.x - sp.x;int dy = ep.y - sp.y;if (dx > 0 && dy > 0){//區域Rect box(sp.x, sp.y, dx, dy);		//繪制一個窗口盒子rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);imshow("截取顯示區域窗口", image(box));//復位,為下一次做準備sp.x = -1;sp.y = -1;}}else if (event == EVENT_MOUSEMOVE)	//鼠標移動			   在原圖附件上面取圖{if (sp.x > 0 && sp.y > 0){ep.x = x;ep.y = y;int dx = ep.x - sp.x;int dy = ep.y - sp.y;if (dx > 0 && dy > 0){//截取繪制區域Rect box(sp.x, sp.y, dx, dy);//在原圖附件上顯示繪制的矩形rectangle(image, box, Scalar(0, 0, 255), 2, 8, 0);imshow("鼠標繪制", image);//復制到temp.copyTo(image);}}}
}
void QuickDemo::mouse_drawing_demo(Mat &image)
{//自動調整大小的窗namedWindow("鼠標繪制", WINDOW_AUTOSIZE);//窗口的名稱,回調函數,指向void的指針setMouseCallback("鼠標繪制", on_draw, (void*)(&image));//原圖附件imshow("鼠標繪制", image);//克隆顯示(從原圖附件截取的圖片 克隆 到新建窗口)

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制//qd.polyline_drawing_demo(src);//鼠標操作與響應qd.mouse_drawing_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

五:圖形

1.圖像幾何形狀繪制

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//圖像幾何形狀的繪制
void QuickDemo::drawing_demo(Mat &image)
{//矩形//	Rect rect;//		rect.x = 30;//		rect.y = 90;//		rect.width = 50;//		rect.height = 50;//	//輸入圖像,矩形對象,顏色,線條寬度,線條類型,填充方式(0不填充)//	rectangle(image, rect, Scalar(255, 0, 0), 6, 8, 0);//	imshow("圖形的繪制", image);圓形		//	//輸入圖像,圓的中心點坐標(以像素為單位),圓的半徑,顏色,線條寬度,線條類型,填充方式//	circle(image, Point(50, 90), 15, Scalar(255, 0, 0), 2, LINE_AA, 0);//	imshow("圖形的繪制", image);對兩個圖像進行加權合并//	Mat dst;//	Mat bg = Mat::zeros(image.size(), image.type());//	//輸入圖像,圖像的權重(取值范圍為[0,1]),輸入圖像,圖像的權重(取值范圍為[0,1]),像素值的加權和(范圍為[-128,127]),輸出圖像//	addWeighted(image, 0.7, bg, 0.3, 0, image);//	imshow("圖形的繪制", image);直線//	//輸入圖像,起點,終點,顏色,線條寬度,線條類型,填充方式//	line(image, Point(10, 50), Point(100, 50), Scalar(0, 0, 255), 8, LINE_AA, 0);//	imshow("圖形的繪制", image);//橢圓RotatedRect rtt;//指定橢圓的位置、大小和方向rtt.center = Point(90, 90);rtt.size = Size(20, 50);rtt.angle = 0.0;//輸入圖像,位置 大小 方向,顏色,線條寬度,線條類型ellipse(image, rtt, Scalar(0, 0, 255), 2, 8);imshow("圖形的繪制", image);}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制qd.drawing_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

?

?

?

2.多邊形填充與繪制

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//多邊形填充與繪制
void QuickDemo::polyline_drawing_demo(Mat &image)
{Mat canvas = Mat::zeros(Size(512, 512), CV_8UC3);//各個點Point p1(100, 100);Point p2(350, 100);Point p3(450, 280);Point p4(320, 450);Point p5(80, 400);//寫入到容器std::vector<Point>pts;pts.push_back(p1);pts.push_back(p2);pts.push_back(p3);pts.push_back(p4);pts.push_back(p5);//繪制多邊形輪廓填充[只能填充]:地方,包含多線段頂點坐標的數組,顏色,線段繪制方式,對齊坐標的位數//fillPoly(canvas, pts, Scalar(122, 155, 255), 8, 0);//繪制多邊形輪廓:地方,包含多線段頂點坐標的數組,線段是否封閉,顏色,線寬,線段繪制方式,對齊坐標的位數//polylines(canvas, pts, true, Scalar(0, 0, 255), 2, 8, 0);std::vector<std::vector<Point>>contours;//把各個點導入數組contours.push_back(pts);//繪制多邊形輪廓填充[能填充,還可以繪制]:地方,包含多線段頂點坐標的數組,-1表示填充(正表示多邊形的繪制 為負表示多邊形的填充),輪廓的顏色,輪廓的線寬drawContours(canvas, contours, -1, Scalar(0, 0, 255), -1);imshow("多邊形繪制", canvas);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制qd.polyline_drawing_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

六:視頻

1.視頻文件攝像頭使用

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);//鼠標操作與響應void QuickDemo::mouse_drawing_demo(Mat &image);//圖像像素類型的轉換與歸一化void QuickDemo::norm_demo(Mat &image);//圖像的放縮與差值void QuickDemo::resize_demo(Mat &image);//圖像的旋轉:定義好的void QuickDemo::flip_demo(Mat &image);//圖像的旋轉:自定義void QuickDemo::rotate_demo(Mat &image);//視頻文件攝像頭使用void QuickDemo::video_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//視頻文件攝像頭使用
void QuickDemo::video_demo(Mat &image)
{//讀取視頻的地址VideoCapture capture("F:/images/beauty.mp4");  Mat frame;while (true){//讀取視頻capture.read(frame); if (frame.empty()){break;}//圖像鏡像操作:左右翻轉//flip(frame, frame, 1);imshow("視頻播放", frame);//對視頻調用之前的demo:色彩轉換//colorSpace_Demo(frame);//控制速度int c = waitKey(10);if (c == 27) { //esc 退出應用程序break;}}//釋放相機的資源capture.release();
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制//qd.polyline_drawing_demo(src);//鼠標操作與響應//qd.mouse_drawing_demo(src);//圖像像素類型的轉換與歸一化//qd.norm_demo(src);//圖像的放縮與差值//qd.resize_demo(src);//圖像的旋轉:定義好的//qd.flip_demo(src);//圖像的旋轉:自定義//qd.rotate_demo(src);//視頻文件攝像頭使用qd.video_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

2.視頻處理與保存

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);//鼠標操作與響應void QuickDemo::mouse_drawing_demo(Mat &image);//圖像像素類型的轉換與歸一化void QuickDemo::norm_demo(Mat &image);//圖像的放縮與差值void QuickDemo::resize_demo(Mat &image);//圖像的旋轉:定義好的void QuickDemo::flip_demo(Mat &image);//圖像的旋轉:自定義void QuickDemo::rotate_demo(Mat &image);//視頻文件攝像頭使用void QuickDemo::video_demo1(Mat &image);//視頻處理與保存void QuickDemo::video_demo2(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//視頻處理與保存
void QuickDemo::video_demo2(Mat &image)
{//讀取視頻的地址VideoCapture capture("F:/images/beauty.mp4");int frame_width = capture.get(CAP_PROP_FRAME_WIDTH);		//獲取視頻的寬度int frame_height = capture.get(CAP_PROP_FRAME_HEIGHT);		//獲取視頻的高度int count = capture.get(CAP_PROP_FRAME_COUNT);				//視頻總的幀數												 double fps = capture.get(CAP_PROP_FPS);						//獲取幀率std::cout << "寬度" << frame_width << std::endl;std::cout << "高度" << frame_height << std::endl;std::cout << "幀數" << count << std::endl;std::cout << "幀率" << fps << std::endl;//保存地址,獲取圖片的格式,圖片的幀數,視頻寬高,真VideoWriter writer("F:/images/test.mp4", capture.get(CAP_PROP_FOURCC), fps, Size(frame_width, frame_height), true);Mat frame;while (true){//讀取視頻capture.read(frame);if (frame.empty()){break;}//圖像鏡像操作:左右翻轉//flip(frame, frame, 1);imshow("視頻播放", frame);//對視頻調用之前的demo:色彩轉換//colorSpace_Demo(frame);//控制速度int c = waitKey(30);if (c == 27) { //esc 退出應用程序break;}}capture.release();	//釋放相機的資源writer.release();	//釋放存放的資源
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制//qd.polyline_drawing_demo(src);//鼠標操作與響應//qd.mouse_drawing_demo(src);//圖像像素類型的轉換與歸一化//qd.norm_demo(src);//圖像的放縮與差值//qd.resize_demo(src);//圖像的旋轉:定義好的//qd.flip_demo(src);//圖像的旋轉:自定義//qd.rotate_demo(src);//視頻文件攝像頭使用//qd.video_demo1(src);//視頻處理與保存qd.video_demo2(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

七:直方圖

1.圖像的直方圖

圖像直方圖的解釋:將一幅圖像的每個通道的像素強度分布以直方圖的形式展現出來,便于觀察和分析圖像的亮度分布特征是一種用于計算機視覺和圖像識別的特征描述符直方圖主要基于圖像局部方塊的邊緣方向直方圖它將圖像劃分為小的細胞單元,每個細胞單元包含9個方向的邊緣強度然后,將這些邊緣強度分布(即直方圖)組合起來,形成整個圖像的直方圖這個直方圖描述了圖像中物體的形狀信息廣泛地應用于圖像處理的各個領域,特別是灰度圖像的閾值分割、基于顏色的圖像檢索以及圖像分類、反向投影跟蹤分類灰度直方圖顏色直方圖優缺點直方圖的優點是:圖像平移、旋轉、縮放不變性它對圖像的幾何和光照變化具有魯棒性它能夠有效地描述物體的邊緣和輪廓信息它對背景噪聲不敏感直方圖的缺點是:直方圖通常需要組合許多小塊的信息,這可能會導致對圖像中物體的部分缺失或變形它不能提供物體的空間位置信息直方圖的計算復雜度較高作用:用于圖像分割:對于具有雙峰性的圖像,可以利用大津法對圖像進行分割,這種方法對圖像的幾何和光照變化具有魯棒性用于圖像識別:通過研究質量波動狀況之后,就能掌握過程的狀況,從而確定在什么地方集中力量進行質量改進工作用于行人檢測:如果圖像中沒有人跟有人的直方圖是不同的,通過比較兩幅圖像的直方圖,可以判斷這兩幅圖像是否相似其他概念:Bins是指直方圖的大小范圍對于像素值取值在0~255之間的,最少有256個bin此外還可以有16、32、48、128等,256除以bin的大小應該是整數倍直方圖歸一化是一種圖像處理方法,可以將直方圖的像素分布調整為均勻分布的狀態,使得圖像的對比度得到提升

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);//鼠標操作與響應void QuickDemo::mouse_drawing_demo(Mat &image);//圖像像素類型的轉換與歸一化void QuickDemo::norm_demo(Mat &image);//圖像的放縮與差值void QuickDemo::resize_demo(Mat &image);//圖像的旋轉:定義好的void QuickDemo::flip_demo(Mat &image);//圖像的旋轉:自定義void QuickDemo::rotate_demo(Mat &image);//視頻文件攝像頭使用void QuickDemo::video_demo1(Mat &image);//視頻處理與保存void QuickDemo::video_demo2(Mat &image);//圖像直方圖void QuickDemo::histogram_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//圖像直方圖
void QuickDemo::histogram_demo(Mat &image) {// 三通道分離std::vector<Mat> bgr_plane;//split函數被用于將一個BGR圖像(即具有三個顏色通道的圖像)拆分為三個單獨的通道,每個通道都包含一個單通道的圖像split(image, bgr_plane);// 定義參數變量const int channels[1] = { 0 };const int bins[1] = { 256 };			//存儲直方圖的bin(大小范圍)float hranges[2] = { 0,255 };			//通道的強度范圍const float* ranges[1] = { hranges };//存儲計算得到的直方圖Mat b_hist;Mat g_hist;Mat r_hist;// 計算Blue, Green, Red通道的直方圖:計算圖像的直方圖//1~4:要計算直方圖的圖像,通道數,直方圖的掩膜圖像的通道索引,空的掩膜圖像(使用掩膜計算直方圖的圖像區域)//5~8:存儲計算得到的直方圖,直方圖的維度是一維,灰度圖像的強度值范圍為0到255,包含每個通道的強度范圍數組calcHist(&bgr_plane[0], 1, channels, Mat(), b_hist, 1, bins, ranges);//calcHist(&bgr_plane[0], 1, 0, Mat(), b_hist, 1, bins, ranges);calcHist(&bgr_plane[1], 1, channels, Mat(), g_hist, 1, bins, ranges);calcHist(&bgr_plane[2], 1, channels, Mat(), r_hist, 1, bins, ranges);// 顯示直方圖:創建一個大小為400x512的黑色圖像(所有像素值初始化為0)int hist_w = 512;											//直方圖的每個條形的寬度int hist_h = 400;											//直方圖的高度int bin_w = cvRound((double)hist_w / bins[0]);				//每個直方圖條形的寬度//cvRound():返回跟參數最接近的整數值,即四舍五入//cvRound()函數轉換為整數,以確保繪制的直線端點與像素中心對齊Mat histImage = Mat::zeros(hist_h, hist_w, CV_8UC3);		//存儲創建的直方圖圖像//將數據類型設置為CV_8UC3。這表示每個像素使用8位無符號整數,并且具有三個通道(紅、綠、藍)// 對每個通道的直方圖進行歸一化:像素均勻分布//1~4:輸入數組進行歸一化的直方圖數據,輸出數組,歸一化的最小值,歸一化的最大值//5~7:歸一化類型(將原始數據線性縮放到指定范圍),用于存儲歸一化后的數據的矩陣,傳遞給函數作為可選的矩陣參數normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat());// 畫曲線,將直方圖數據可視化:繪制出每個通道的直方圖,并將它們疊加在同一個圖像上,以展示圖像的顏色分布//方法一:嵌套for (int i = 1; i < bins[0]; i++) {		//在圖像上繪制直線line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(b_hist.at<float>(i - 1))),		//輸入圖像,起點,終點//計算當前bin的橫坐標:列表的索引是從0開始的,所以需要減去1才能對應到bin的索引//計算當前bin的縱坐標:b_hist.at<float>(i - 1)獲取第i個bin的直方圖值,,將縱坐標取反,即從直方圖高度減去該值,以得到圖像中對應的像素位置//在給定的代碼中,hist_h是直方圖的基線(即y=0的位置)是固定的//而cvRound(b_hist.at<float>(i - 1))則是第i個直方圖的峰值//因此,通過減去cvRound(b_hist.at<float>(i - 1)),我們可以將直方圖向下移動,使其與基線對齊//減去cvRound(b_hist.at<float>(i - 1))是為了將直方圖向下移動一定的距離//定位直線起點和終點在圖像中的位置			起點 終點,顏色,線寬為2個像素,線類型為8,沒有像素偏移//通過使用Point對象,我們可以方便地指定直線的起點和終點在圖像中的準確位置Point(bin_w*(i), hist_h - cvRound(b_hist.at<float>(i))), Scalar(255, 0, 0), 2, 8, 0);	//起點,終點,藍色line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(g_hist.at<float>(i - 1))),Point(bin_w*(i), hist_h - cvRound(g_hist.at<float>(i))), Scalar(0, 255, 0), 2, 8, 0);	//綠色line(histImage, Point(bin_w*(i - 1), hist_h - cvRound(r_hist.at<float>(i - 1))),Point(bin_w*(i), hist_h - cvRound(r_hist.at<float>(i))), Scalar(0, 0, 255), 2, 8, 0);	//紅色}//方法二:這個比較好理解for (int i = 0; i < 256; i++) {Point p01(bin_w * i, hist_h - cvRound(b_hist.at<float>(i)));Point p02(bin_w * i + 1, hist_h - cvRound(b_hist.at<float>(i + 1)));line(histImage, p01, p02, Scalar(255, 0, 0), 1, 8, 0);Point p11(bin_w * i, hist_h - cvRound(g_hist.at<float>(i)));Point p12(bin_w * i + 1, hist_h - cvRound(g_hist.at<float>(i + 1)));line(histImage, p11, p12, Scalar(0, 255, 0), 1, 8, 0);Point p21(bin_w * i, hist_h - cvRound(r_hist.at<float>(i)));Point p22(bin_w * i + 1, hist_h - cvRound(r_hist.at<float>(i + 1)));			line(histImage, p21, p22, Scalar(0, 0, 255), 1, 8, 0);}// 顯示直方圖namedWindow("直方圖曲線", WINDOW_AUTOSIZE);imshow("直方圖曲線", histImage);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制//qd.polyline_drawing_demo(src);//鼠標操作與響應//qd.mouse_drawing_demo(src);//圖像像素類型的轉換與歸一化//qd.norm_demo(src);//圖像的放縮與差值//qd.resize_demo(src);//圖像的旋轉:定義好的//qd.flip_demo(src);//圖像的旋轉:自定義//qd.rotate_demo(src);//視頻文件攝像頭使用//qd.video_demo1(src);//視頻處理與保存//qd.video_demo2(src);//圖像直方圖qd.histogram_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

2.二維2D直方圖

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);//鼠標操作與響應void QuickDemo::mouse_drawing_demo(Mat &image);//圖像像素類型的轉換與歸一化void QuickDemo::norm_demo(Mat &image);//圖像的放縮與差值void QuickDemo::resize_demo(Mat &image);//圖像的旋轉:定義好的void QuickDemo::flip_demo(Mat &image);//圖像的旋轉:自定義void QuickDemo::rotate_demo(Mat &image);//視頻文件攝像頭使用void QuickDemo::video_demo1(Mat &image);//視頻處理與保存void QuickDemo::video_demo2(Mat &image);//圖像直方圖void QuickDemo::histogram_demo(Mat &image);//二維直方圖void QuickDemo::histogram_2d_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//二維2D直方圖
void QuickDemo::histogram_2d_demo(Mat &image) {Mat hsv,hs_hist;	//輸入輸出圖像cvtColor(image, hsv, COLOR_BGR2HSV);int hbins = 30, sbins = 32;							//h30行,s32列int hist_bins[] = { hbins, sbins };					//直方圖的bin數量float h_range[] = { 0, 180 };float s_range[] = { 0, 256 };const float* hs_ranges[] = { h_range, s_range };	//包含每個通道的取值范圍的數組//計算一維數組的直方圖int hs_channels[] = { 0, 1 };//計算一維數組的直方圖:1~5:輸入圖像的指針,直方圖的通道數,包含通道名稱的數組,存儲計算得到的直方圖,輸出圖像即直方//					  6~10:直方圖的維度-2D,直方圖的bin數量,包含每個通道的取值范圍的數組,是否將輸入圖像歸一化,是否計算累積分布函數calcHist(&hsv, 1, hs_channels, Mat(), hs_hist, 2, hist_bins, hs_ranges, true, false);//存儲下面畫的矩形double maxVal = 0;//這個函數的作用是在給定的數組或矩陣中尋找元素的最大值,并返回它們的位置//參數:計算最小值和最大值的輸入數組或圖像,要計算的維度或軸的參數- 0表示在第一個維度,存儲計算得到的最大值,范圍或邊界,范圍或邊界minMaxLoc(hs_hist, 0, &maxVal, 0, 0);int scale = 10;//sbins*scale行和hbins*scale列,數據類型為CV_8UC3,即8位無符號整數(每個通道一個)Mat hist2d_image = Mat::zeros(sbins*scale, hbins * scale, CV_8UC3);//疊加矩形for (int h = 0; h < hbins; h++) {for (int s = 0; s < sbins; s++){//位于橫h,列s處的頻次float binVal = hs_hist.at<float>(h, s);//顏色int intensity = cvRound(binVal * 255 / maxVal);//畫矩形rectangle(hist2d_image,									//輸入圖像Point(h*scale, s*scale),						//左上角的坐標Point((h + 1)*scale - 1, (s + 1)*scale - 1),	//右下角的坐標Scalar::all(intensity),							//顏色-1);											//線條寬度}}//將灰度圖像轉換為彩色圖像,以便更好地可視化直方圖數據//通過對每個像素應用顏色映射來將灰度值映射為彩色值,從而將灰度圖像轉換為彩色圖像//輸入的2D直方圖圖像-通常為灰度圖像,輸出圖像-即應用顏色映射后的圖像,顏色映射類型-這里使用的是JET顏色映射applyColorMap(hist2d_image, hist2d_image, COLORMAP_JET);// 顯示直方圖imshow("二維直方圖", hist2d_image);//imwrite("F:/images/zhifangtu.jpg", hist2d_image);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制//qd.polyline_drawing_demo(src);//鼠標操作與響應//qd.mouse_drawing_demo(src);//圖像像素類型的轉換與歸一化//qd.norm_demo(src);//圖像的放縮與差值//qd.resize_demo(src);//圖像的旋轉:定義好的//qd.flip_demo(src);//圖像的旋轉:自定義//qd.rotate_demo(src);//視頻文件攝像頭使用//qd.video_demo1(src);//視頻處理與保存//qd.video_demo2(src);//圖像直方圖//qd.histogram_demo(src);//二維直方圖qd.histogram_2d_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

3.直方圖的均衡化

test.h? ? ? ?

#include<opencv2/opencv.hpp>
using namespace cv;//創建一個QuickDemo對象
class QuickDemo 
{public://色彩轉換void colorSpace_Demo(Mat &imge);//圖像對象的創建void mat_creation_demo(Mat &imge);//圖像像素的讀寫void pixel_visit_demo1(Mat &image);	//數組void pixel_visit_demo2(Mat &image);	//指針//圖像像素的算術操作void operators_demo(Mat &image);//滾動條調整圖像亮度void tracking_bar_demo1(Mat &image);//滾滾動條參數傳遞(亮度和對比度)void tracking_bar_demo2(Mat &image);//鍵盤響應void key_demo(Mat &image);//opencv自帶顏色操作void color_style_demo(Mat &image);//圖像像素的邏輯操作void bitwise_demo(Mat &image);//通道的分離與合并void channels_demo(Mat &image);//圖像色彩空間轉換void inrange_demo(Mat &image);//圖像像素值統計void pixel_statistic_demo(Mat &image);//圖像幾何形狀的繪制void drawing_demo(Mat &image);//隨機數與隨機顏色void QuickDemo::random_drawing();//多邊形填充與繪制void QuickDemo::polyline_drawing_demo(Mat &image);//鼠標操作與響應void QuickDemo::mouse_drawing_demo(Mat &image);//圖像像素類型的轉換與歸一化void QuickDemo::norm_demo(Mat &image);//圖像的放縮與差值void QuickDemo::resize_demo(Mat &image);//圖像的旋轉:定義好的void QuickDemo::flip_demo(Mat &image);//圖像的旋轉:自定義void QuickDemo::rotate_demo(Mat &image);//視頻文件攝像頭使用void QuickDemo::video_demo1(Mat &image);//視頻處理與保存void QuickDemo::video_demo2(Mat &image);//圖像直方圖void QuickDemo::histogram_demo(Mat &image);//二維直方圖void QuickDemo::histogram_2d_demo(Mat &image);//直方圖的均衡化void QuickDemo::histogram_eq_demo(Mat &image);};

test.cpp? ? ? ?

#include<test.h>//直方圖的均衡化
void QuickDemo::histogram_eq_demo(Mat &image) {Mat gray;//圖像轉換cvtColor(image, gray, COLOR_BGR2GRAY);imshow("灰度圖像", gray);Mat dst;//輸入,輸出equalizeHist(gray, dst);imshow("直方圖均衡化演示", dst);
}

main.cpp? ? ? ?

//知識點	IM表示圖片//讀取圖像:imread//顯示圖像:imshow//色彩空間轉換函數(B G R):cvtColor//COLOR_BGR2GRAY = 6彩色到灰度//COLOR_GRAY2BGR = 8灰度到彩色//COLOR_BGR2HSV  = 40BGR到HSV//COLOR_HSV2BGR  = 54HSV到BGR//保存圖片:imwrite(保存路徑,內存對象)#include<opencv2/opencv.hpp>
#include<iostream>
#include<test.h>using namespace std;
using namespace cv;
int main()
{//讀取進來的數據以矩陣的形勢Mat src = imread("F:/images/gril.jpg", IMREAD_ANYCOLOR);	    //第二個參數代表顯示一張灰度圖像//看是否是空圖片if (src.empty()){printf("圖片不存在");return -1;}//創建了一個新窗口:超過屏幕的圖像無法顯示時候調用此函數namedWindow("輸入窗口", WINDOW_FREERATIO);					   //參數1表示名稱,參數二代表窗口自由顯示//表示顯示在新創建的輸入窗口上imshow("輸入窗口", src);									   //第一個參數表示窗口名稱,src表示數據對象Mat //在主函數中調用之前創建的類對象	QuickDemo qd;//色彩轉換//qd.colorSpace_Demo(src);//圖像對象的創建//qd.mat_creation_demo(src);//圖像像素的讀寫//qd.pixel_visit_demo1(src);	//數組//qd.pixel_visit_demo2(src);	//指針//圖像像素的算術操作//qd.operators_demo(src);//滾動條調整圖像亮度//qd.tracking_bar_demo1(src);//滾動條參數傳遞(亮度和對比度)//qd.tracking_bar_demo2(src);//鍵盤響應//qd.key_demo(src);//opencv自帶顏色操作//qd.color_style_demo(src);//圖像像素的邏輯操作//qd.bitwise_demo(src);//通道的分離與合并//qd.channels_demo(src);//圖像色彩空間轉換//qd.inrange_demo(src);//圖像像素值統計//qd.pixel_statistic_demo(src);//圖像幾何形狀的繪制//qd.drawing_demo(src);//隨機數與隨機顏色//qd.random_drawing();//多邊形填充與繪制//qd.polyline_drawing_demo(src);//鼠標操作與響應//qd.mouse_drawing_demo(src);//圖像像素類型的轉換與歸一化//qd.norm_demo(src);//圖像的放縮與差值//qd.resize_demo(src);//圖像的旋轉:定義好的//qd.flip_demo(src);//圖像的旋轉:自定義//qd.rotate_demo(src);//視頻文件攝像頭使用//qd.video_demo1(src);//視頻處理與保存//qd.video_demo2(src);//圖像直方圖//qd.histogram_demo(src);//二維直方圖//qd.histogram_2d_demo(src);//直方圖的均衡化qd.histogram_eq_demo(src);waitKey(0);													   //執行到這句,程序阻塞。參數表示延時時間。單位ms毫秒destroyAllWindows();										   //銷毀前面創建的顯示窗口return 0;
}

運行結果? ? ? ?

Opencv4基于C++的 實時人臉檢測

Opencv4基于C++的 實時人臉檢測

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/35983.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/35983.shtml
英文地址,請注明出處:http://en.pswp.cn/news/35983.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

感受RFID服裝門店系統的魅力

嘿&#xff0c;親愛的時尚追隨者們&#xff01;今天小編要給你們帶來一股時尚新風潮&#xff0c;讓你們感受一下什么叫做“RFID服裝門店系統”&#xff0c;這個超酷的東西&#xff01; 別著急&#xff0c;先別翻白眼&#xff0c;小編來解釋一下RFID是什么玩意兒。它是射頻識別…

云計算——存儲虛擬化功能

作者簡介&#xff1a;一名云計算網絡運維人員、每天分享網絡與運維的技術與干貨。 座右銘&#xff1a;低頭趕路&#xff0c;敬事如儀 個人主頁&#xff1a;網絡豆的主頁????? 目錄 前期回顧 前言 一.存儲虛擬化功能 1.精簡磁盤和空間回收 2.快照 &#xff08;1&a…

面試熱題(反轉字符串中的單詞)

給你一個字符串 s &#xff0c;請你反轉字符串中 單詞 的順序。 單詞 是由非空格字符組成的字符串。s 中使用至少一個空格將字符串中的 單詞 分隔開。 返回 單詞 順序顛倒且 單詞 之間用單個空格連接的結果字符串。 注意&#xff1a;輸入字符串 s中可能會存在前導空格、尾隨空格…

JVM——棧和堆概述,以及有什么區別?

方法棧 方法棧并不是某一個 JVM 的內存空間&#xff0c;而是我們描述方法被調用過程的一個邏輯概念。 在同一個線程內&#xff0c;T1()調用T2()&#xff1a; T1()先開始&#xff0c;T2()后開始&#xff1b;T2()先結束&#xff0c;T1()后結束。 堆和棧概述 從英文單詞角度來…

Maven介紹,部署在eclipse中

目錄 一.Maven介紹 1&#xff0c;什么是maven&#xff1f; 2. 為什么maven會在企業中大量使用&#xff1f; 3.沒有使用maven的前后區別? 4.maven在Java開發中的實際效果圖 二.maven部署在eclipse中 1.下載maven在其官方網址下載&#xff08;當然實際下載也要根據個人的…

服務器安裝Tomcat

下載Tomcat 下載地址在這&#xff1a; Tomcat官網 下載完成以后把壓縮包上傳到服務器中&#xff08;我傳到了www/java&#xff09;,進行解壓(解壓到)&#xff0c;如果沒有進行指定解壓到哪里&#xff0c;默認是到root文件夾中 tar -zxvf /www/java/apache-tomcat-9.0.103.tar.…

統計學補充概念03-核密度估計

概念 核密度估計&#xff08;Kernel Density Estimation&#xff0c;簡稱 KDE&#xff09;是一種非參數統計方法&#xff0c;用于估計隨機變量的概率密度函數&#xff08;Probability Density Function&#xff0c;PDF&#xff09;。它通過在每個數據點周圍放置核函數&#xf…

day 10 | 232.用棧實現隊列、 225. 用隊列實現棧

目錄&#xff1a; 解題及思路學習 232.用棧實現隊列 https://leetcode.cn/problems/implement-queue-using-stacks/ 模擬題&#xff0c;用兩個棧來實現隊列的功能。 class MyQueue { public:stack<int> stIn;stack<int> stOut;/** Initialize your data struc…

HCIP學習--BGP3

目錄 前置內容 BGP下一跳的修改問題 BGP的屬性 配置 PrefVal權重屬性 負載分擔 LocPrf 負載分擔 NextHop AS-PATH Ogn 配置 MED 配置 BGP選路規則 BGP的社團屬性 配置及解釋 前置內容 HCIP學習--BGP1_板栗妖怪的博客-CSDN博客 HCIP學習--BGP2_板栗妖怪的博客…

031_小馳私房菜_MTK平臺Camera基本流程,日志信息打印

這篇文章主要介紹mtk平臺,camera基本流程的日志信息打印。針對下面幾點展開: 一) camera打開流程; 二) 幀請求 && 幀回調; 三) 拍照; MTK平臺camera模塊,如果想要打開更多日志,一般需要先設置 adb shell setprop "vendor.debug.camera.log" 1 然后…

STM32控制SG90舵機原理及代碼

STM32控制SG90舵機原理及代碼 一.SG90舵機原理二.控制SG90舵機三.代碼實例3.1 配置定時器3.2 main 函數 四.實驗現象 一.SG90舵機原理 舵機的運用還是比較廣泛的&#xff0c;那么舵機工作原理是什么呢&#xff0c;一般來說我們給舵機一個信號他就能工作了&#xff0c;那么這個…

00 - 環境配置

查看所有文章鏈接&#xff1a;&#xff08;更新中&#xff09;GIT常用場景- 目錄 文章目錄 1. 環境說明2. 安裝配置2.1 配置user信息2.2 config的三個作用域 3. 建git倉庫3.1 把已有的項目代碼納入git管理3.2 新建的項目直接用git管理3.3 配置local的user和email3.4 優先級&…

Redis_緩存1_緩存類型

14.redis緩存 14.1簡介 穿透型緩存&#xff1a; 緩存與后端數據交互在一起&#xff0c;對服務端的調用隱藏細節。如果從緩存中可以讀到數據&#xff0c;就直接返回&#xff0c;如果讀不到&#xff0c;就到數據庫中去讀取&#xff0c;從數據庫中讀到數據&#xff0c;也是先更…

股票指數——RSI指數

RSI指數的計算非常簡單&#xff0c;就是使用一段時間內的平均上漲除以平均上漲加平均下跌&#xff08;取正值&#xff09;。也就意味著RSI指數的取值是[0,100]之間&#xff0c;其中0表示周期內沒有上漲的&#xff0c;100表示周期內沒有下跌的。RSI的直觀意義是它表示了一段周期…

學習筆記整理-JS-06-函數

一、函數基本使用 1. 什么是函數 函數就是語句的封裝&#xff0c;可以讓這些代碼方便地被復用。函數具有"一次定義&#xff0c;多次調用"的優點。使用函數&#xff0c;可以簡化代碼&#xff0c;讓代碼更具有可讀性。 2. 函數的定義和調用 和變量類似&#xff0c;函…

Jupyter并發測試以后出現EOFError marshal data too short

Jupyter 并發測試以后出現EOFError: marshal data too short 背景 由于項目需求需要用戶能進行網頁在線運行python代碼程序&#xff0c;調研后決定使用Jupyter的服務接口實現此功能&#xff0c;目前使用docker進行容器化部署&#xff0c;測試針對次服務進行并發測試。測試并發…

JimuReport積木報表 v1.6.0版本發布—免費的可視化報表

項目介紹 一款免費的數據可視化報表&#xff0c;含報表和大屏設計&#xff0c;像搭建積木一樣在線設計報表&#xff01;功能涵蓋&#xff0c;數據報表、打印設計、圖表報表、大屏設計等&#xff01; Web 版報表設計器&#xff0c;類似于excel操作風格&#xff0c;通過拖拽完成報…

開源代碼分享(13)—整合本地電力市場與級聯批發市場的投標策略(附matlab代碼)

1.引言 1.1摘要 本地電力市場是在分配層面促進可再生能源的效率和使用的一種有前景的理念。然而&#xff0c;作為一個新概念&#xff0c;如何設計和將這些本地市場整合到現有市場結構中&#xff0c;并從中獲得最大利潤仍然不清楚。在本文中&#xff0c;我們提出了一個本地市場…

中睿天下Coremail | 2023年第二季度企業郵箱安全態勢觀察

今日&#xff0c;中睿天下聯合Coremail郵件安全發布《2023第二季度企業郵箱安全性研究報告》&#xff0c;對2023第二季度和2023上半年的企業郵箱的安全風險進行了分析。 一 垃圾郵件同比下降16.38% 根據監測&#xff0c;2023年Q2垃圾郵件數量達到6.47億封&#xff0c;環比下降…

003-Spring boot 啟動流程分析

目錄 啟動流程分析創建 SpringApplication啟動 run(String... args) 啟動流程分析 SpringApplication.run(App.class, args);return new SpringApplication(primarySources).run(args);創建 SpringApplication SpringApplication(primarySources):this.primarySources new L…