基础知识
HSV图像
注意如果用8U来存HSV图像,H的范围是0~180,S、V的范围是都是0~255
H坐标颜色对应
红0
黄30
绿60
青90
蓝120
紫150
大概上下浮动10左右可以提取某一种颜色
调完颜色参数之后调S(饱和度参数),最后再调亮度参数
使用OpenCV的inrange函数,可以快速进行颜色提取
轮廓识别
直接使用findContours函数
findContours(Mat binImg, vector<vector<Point>> contours, vector<Vec4i> hierarchy, int mode, int method, Point offset = Point())
binImg:输入二值化图像
contours:轮廓点集
hierarchy:拓扑结构
mode:轮廓返回模式
RETR_TREE:返回所有轮廓和拓扑结构
RETR_EXTERNAL:只返回最外层轮廓
RETR_LIST:返回所有轮廓但不建立拓扑结构
method:轮廓发现方法,常用CHAIN_APPROX_SIMPLE
再新建一个矩阵来把提取出来的轮廓画出来
使用drawContours函数即可
drawContours(binImg, contours, contourIdx, color, thickness, lineType, hierarchy, maxlevel, offset)
代码
#include<opencv2/opencv.hpp>
#include<vector>
using namespace cv;
using namespace std;
vector<vector<Point> > pt;
int main(){
Mat img=imread("../2021-03-23 222039.jpg");
namedWindow("img",0);imshow("img",img);
cvtColor(img,img,COLOR_BGR2HSV);
GaussianBlur(img,img,Size(5,5),3);
Mat yellow,blue,red;
inRange(img,Scalar(20,130,0),Scalar(35,255,255),yellow);
inRange(img,Scalar(110,90,100),Scalar(130,255,255),blue);
inRange(img,Scalar(0,95,0),Scalar(10,255,255),red);
namedWindow("yellow",0);imshow("yellow",yellow);
namedWindow("blue",0);imshow("blue",blue);
namedWindow("red",0);imshow("red",red);
findContours(yellow,pt,RETR_EXTERNAL,CHAIN_APPROX_SIMPLE);
Mat con(img.size(),CV_8UC3);
drawContours(con,pt,-1,Scalar(255,255,255),5);
namedWindow("con",0);imshow("con",con);
waitKey(0);
return 0;
}
效果