要點:
1.識別一種顏色
minH = 16; //色相 maxH = 35;
minS = 160; //飽和度 maxS = 255;
minV = 50; //亮度
maxV = 255; // inRange(原圖像, 最小值的范圍, 最大值的范圍, 輸出圖像); //將圖像二值化,即輸出圖像是黑白二值圖像,其中 最小值<=像素點<=最大值 的像素點是白色
inRange(hsvImg, Scalar(minH, minS, minV), Scalar(maxH, maxS, maxV), yellowImg);
2.識別圖片中的黃藍紅三色
//創建三個 Mat 來分別存儲識別黃藍紅三色並二值化后的圖片
Mat yellowImg, blueImg, redImg; for (int i = 0; i < 3; i++){ switch (i){ case 0: //黃色
minH = 16; maxH = 35; minS = 160; maxS = 255; minV = 50; maxV = 255; // inRange(原圖像, 最小值的范圍, 最大值的范圍, 輸出圖像); //將圖像二值化,即輸出圖像是黑白二值圖像,其中 最小值<=像素點<=最大值 的像素點是白色
inRange(hsvImg, Scalar(minH, minS, minV), Scalar(maxH, maxS, maxV), yellowImg); break; case 1: //藍色
minH = 70; maxH = 120; minS = 150; maxS = 255; minV = 50; maxV = 255; inRange(hsvImg, Scalar(minH, minS, minV), Scalar(maxH, maxS, maxV), blueImg); break; case 2: //紅色
minH = 0; maxH = 15; minS = 160; maxS = 255; minV = 50; maxV = 255; inRange(hsvImg, Scalar(minH, minS, minV), Scalar(maxH, maxS, maxV), redImg); break; default: printf("顏色標志輸入錯誤\n"); } }
3.合並三張圖片
Mat resultImg; Mat yeBluImg; //圖像算數運算————bitwise_or() 合並運算(或)
bitwise_or(yellowImg, blueImg, yeBluImg);
bitwise_or(yeBluImg, redImg, resultImg);
4.圖片去噪
//開操作 (去除一些噪點):先腐蝕,再膨脹,可清除一些小東西(亮的),放大局部低亮度的區域
//如果二值化后圖片干擾部分依然很多,增大下面的size
Mat eleOpen = getStructuringElement(MORPH_RECT, Size(6, 6));//返回指定形狀和尺寸的結構元素
morphologyEx(resultImg, resultImg, MORPH_OPEN, eleOpen);
代碼示例:
#include<opencv.hpp>
using namespace cv; using namespace std; int main(){ Mat srcImg = imread("C:/Users/齊明洋/Desktop/tem2.png"); Mat hsvImg; //將RGB顏色空間轉換為HSV顏色空間
cvtColor(srcImg, hsvImg, COLOR_BGR2HSV); int minH = 0; int maxH = 0; int minS = 0; int maxS = 0; int minV = 0; int maxV = 0; Mat yellowImg, blueImg, redImg; for (int i = 0; i < 3; i++){ switch (i){ case 0: //黃色
minH = 16; maxH = 35; minS = 160; maxS = 255; minV = 50; maxV = 255; // inRange(原圖像, 最小值的范圍, 最大值的范圍, 輸出圖像); //將圖像二值化,即輸出圖像是黑白二值圖像,其中 最小值<=像素點<=最大值 的像素點是白色
inRange(hsvImg, Scalar(minH, minS, minV), Scalar(maxH, maxS, maxV), yellowImg); break; case 1: //藍色
minH = 70; maxH = 120; minS = 150; maxS = 255; minV = 50; maxV = 255; inRange(hsvImg, Scalar(minH, minS, minV), Scalar(maxH, maxS, maxV), blueImg); break; case 2: //紅色
minH = 0; maxH = 15; minS = 160; maxS = 255; minV = 50; maxV = 255; inRange(hsvImg, Scalar(minH, minS, minV), Scalar(maxH, maxS, maxV), redImg); break; default: printf("顏色標志輸入錯誤\n"); } } Mat resultImg; Mat yeBluImg; //圖像算數運算————合並(或)
bitwise_or(yellowImg, blueImg, yeBluImg); bitwise_or(yeBluImg, redImg, resultImg); //開操作 (去除一些噪點) 如果二值化后圖片干擾部分依然很多,增大下面的size
Mat eleOpen = getStructuringElement(MORPH_RECT, Size(6, 6));//返回指定形狀和尺寸的結構元素
morphologyEx(resultImg, resultImg, MORPH_OPEN, eleOpen);
imshow("原始圖片", srcImg);
imshow("識別結果", resultImg);
waitKey(0); return 0; }
運行結果: