其他分享
首页 > 其他分享> > OpenCV颜色提取,轮廓识别

OpenCV颜色提取,轮廓识别

作者:互联网

基础知识

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;
}

效果

 

 

标签:识别,img,yellow,OpenCV,Scalar,轮廓,red,255
来源: https://blog.csdn.net/C20180602_csq/article/details/120933095