要点:
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; }
运行结果: