先來一波基本的解釋ide
這是基於opencv3的操做函數
仔細看啦字體
int main() //***************形態學濾波*******************??????? { Mat picture; //Original picture from cammmera Mat img; //The picture which has been done VideoCapture capture(0); while (1) { capture >> picture; Mat element = getStructuringElement(MORPH_RECT/*內核狀態*/, Size(9, 11)/*內核尺寸*/);//自定義內核 爲下面的操做作準備 /* MORPH_RECT 矩形 MORPH_CROSS 交叉型 MORPH_ELLIPSE 橢圓型 */ // 下面使用上面定義的內核,改變程度應該改變上面的內核 // dilate(picture, img, element); //膨脹濾波 // erode(picture, img, element); //腐蝕濾波 /* 開運算 先腐蝕 後膨脹 閉運算 先膨脹 後腐蝕 形態學梯度 膨脹圖與腐蝕圖的差 頂帽 原圖像與開運算的差 黑帽 閉運算的結果圖與原圖像的差 */ morphologyEx(picture, img, MORPH_DILATE, element/*getStructuringElement(MORPH_DILATE, Size(25, 25))直接使用element也能夠*/);//膨脹 /* MORPH_DILATE 膨脹 MORPH_ERODE 腐蝕 MORPH_OPEN 開運算 MORPH_CLOSE 閉運算 MORPH_GRADIENT 形態學梯度 MORPH_TOPHAT 頂帽 MORPH_BLACKHAT 黑帽 */ imshow("Original Picture", picture); imshow("Dealed picture", img); waitKey(10); } return 0; }
下面呢是具體的操做ui
記得把圖片改爲本身的spa
解釋真的很很難寫code
//**********綜合演示***************** #include <opencv2/opencv.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> using namespace std; using namespace cv; Mat g_srcImage, g_dstImage;//原始圖和效果圖 int g_nElementShape = MORPH_RECT;//元素結構的形狀 //變量接收的TrackBar位置參數 int g_nMaxIterationNum = 10; int g_nOpenCloseNum = 0; int g_nErodeDilateNum = 0; int g_nTopBlackHatNum = 0; static void on_OpenClose(int, void*);//回調函數 static void on_ErodeDilate(int, void*);//回調函數 static void on_TopBlackHat(int, void*);//回調函數 static void ShowHelpText(); int main() { //改變console字體顏色 system("color 2F"); ShowHelpText(); //載入原圖 g_srcImage = imread("1.jpg"); if (!g_srcImage.data) { printf("Oh,no,讀取srcImage錯誤~! \n"); return false; } //顯示原始圖 namedWindow("【原始圖】"); imshow("【原始圖】", g_srcImage); //建立三個窗口 namedWindow("【開運算/閉運算】", 1); namedWindow("【腐蝕/膨脹】", 1); namedWindow("【頂帽/黑帽】", 1); //參數賦值 g_nOpenCloseNum = 9; g_nErodeDilateNum = 9; g_nTopBlackHatNum = 2; //分別爲三個窗口建立滾動條 createTrackbar("迭代值", "【開運算/閉運算】", &g_nOpenCloseNum, g_nMaxIterationNum * 2 + 1, on_OpenClose); createTrackbar("迭代值", "【腐蝕/膨脹】", &g_nErodeDilateNum, g_nMaxIterationNum * 2 + 1, on_ErodeDilate); createTrackbar("迭代值", "【頂帽/黑帽】", &g_nTopBlackHatNum, g_nMaxIterationNum * 2 + 1, on_TopBlackHat); //輪詢獲取按鍵信息 while (1) { int c; //執行回調函數 on_OpenClose(g_nOpenCloseNum, 0); on_ErodeDilate(g_nErodeDilateNum, 0); on_TopBlackHat(g_nTopBlackHatNum, 0); //獲取按鍵 c = waitKey(0); //按下鍵盤按鍵Q或者ESC,程序退出 if ((char)c == 'q' || (char)c == 27) break; //按下鍵盤按鍵1,使用橢圓(Elliptic)結構元素結構元素MORPH_ELLIPSE if ((char)c == 49)//鍵盤按鍵1的ASII碼爲49 g_nElementShape = MORPH_ELLIPSE; //按下鍵盤按鍵2,使用矩形(Rectangle)結構元素MORPH_RECT else if ((char)c == 50)//鍵盤按鍵2的ASII碼爲50 g_nElementShape = MORPH_RECT; //按下鍵盤按鍵3,使用十字形(Cross-shaped)結構元素MORPH_CROSS else if ((char)c == 51)//鍵盤按鍵3的ASII碼爲51 g_nElementShape = MORPH_CROSS; //按下鍵盤按鍵space,在矩形、橢圓、十字形結構元素中循環 else if ((char)c == ' ') g_nElementShape = (g_nElementShape + 1) % 3; } return 0; } //-----------------------------------【on_OpenClose( )函數】---------------------------------- // 描述:【開運算/閉運算】窗口的回調函數 //----------------------------------------------------------------------------------------------- static void on_OpenClose(int, void*) { //偏移量的定義 int offset = g_nOpenCloseNum - g_nMaxIterationNum;//偏移量 int Absolute_offset = offset > 0 ? offset : -offset;//偏移量絕對值 //自定義核 Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset)); //進行操做 if (offset < 0) //此句代碼的OpenCV2版爲: //morphologyEx(g_srcImage, g_dstImage, CV_MOP_OPEN, element); //此句代碼的OpenCV3版爲: morphologyEx(g_srcImage, g_dstImage, MORPH_OPEN, element); else //此句代碼的OpenCV2版爲: //morphologyEx(g_srcImage, g_dstImage, CV_MOP_CLOSE, element); //此句代碼的OpenCV3版爲: morphologyEx(g_srcImage, g_dstImage, MORPH_CLOSE, element); //顯示圖像 imshow("【開運算/閉運算】", g_dstImage); } //-----------------------------------【on_ErodeDilate( )函數】---------------------------------- // 描述:【腐蝕/膨脹】窗口的回調函數 //----------------------------------------------------------------------------------------------- static void on_ErodeDilate(int, void*) { //偏移量的定義 int offset = g_nErodeDilateNum - g_nMaxIterationNum; //偏移量 int Absolute_offset = offset > 0 ? offset : -offset;//偏移量絕對值 //自定義核 Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset)); //進行操做 if (offset < 0) erode(g_srcImage, g_dstImage, element); else dilate(g_srcImage, g_dstImage, element); //顯示圖像 imshow("【腐蝕/膨脹】", g_dstImage); } //-----------------------------------【on_TopBlackHat( )函數】-------------------------------- // 描述:【頂帽運算/黑帽運算】窗口的回調函數 //---------------------------------------------------------------------------------------------- static void on_TopBlackHat(int, void*) { //偏移量的定義 int offset = g_nTopBlackHatNum - g_nMaxIterationNum;//偏移量 int Absolute_offset = offset > 0 ? offset : -offset;//偏移量絕對值 //自定義核 Mat element = getStructuringElement(g_nElementShape, Size(Absolute_offset * 2 + 1, Absolute_offset * 2 + 1), Point(Absolute_offset, Absolute_offset)); //進行操做 if (offset < 0) morphologyEx(g_srcImage, g_dstImage, MORPH_TOPHAT, element); else morphologyEx(g_srcImage, g_dstImage, MORPH_BLACKHAT, element); //顯示圖像 imshow("【頂帽/黑帽】", g_dstImage); } //-----------------------------------【ShowHelpText( )函數】---------------------------------- // 描述:輸出一些幫助信息 //---------------------------------------------------------------------------------------------- static void ShowHelpText() { //輸出一些幫助信息 printf("\n\t請調整滾動條觀察圖像效果\n\n"); printf("\n\t按鍵操做說明: \n\n" "\t\t鍵盤按鍵【ESC】或者【Q】- 退出程序\n" "\t\t鍵盤按鍵【1】- 使用橢圓(Elliptic)結構元素\n" "\t\t鍵盤按鍵【2】- 使用矩形(Rectangle )結構元素\n" "\t\t鍵盤按鍵【3】- 使用十字型(Cross-shaped)結構元素\n" "\t\t鍵盤按鍵【空格SPACE】- 在矩形、橢圓、十字形結構元素中循環\n"); }