一、简介

HSV颜色空间(hue色调,saturation饱和度,value亮度)

二、HSV滑动条

 #include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std; Mat srcImg, hsv_img;
int h_min =,s_min = ,v_min = ;
int h_max = ,s_max = ,v_max = ; void onChange(int, void* param) {
Scalar hsv_min(h_min, s_min, v_min);
Scalar hsv_max(h_max, s_max, v_max);
Mat dst = Mat::zeros(srcImg.size(), srcImg.type());
inRange(srcImg, hsv_min, hsv_max, dst);
imshow("HSV", dst);
} void main()
{
srcImg = imread("E://duck2.jpg");
imshow("src", srcImg);
cvtColor(srcImg, hsv_img, CV_BGR2HSV); //BGR转到HSV颜色空间
namedWindow("HSV", CV_WINDOW_AUTOSIZE);
//创建滚动条
createTrackbar("h_min", "HSV", &h_min, , onChange, );
createTrackbar("s_min", "HSV", &s_min, , onChange, );
createTrackbar("v_min", "HSV", &v_min, , onChange, );
createTrackbar("h_max", "HSV", &h_max, , onChange, );
createTrackbar("s_max", "HSV", &s_max, , onChange, );
createTrackbar("v_max", "HSV", &v_max, , onChange, );
//回调函数初始化
onChange(h_min, );
onChange(s_min, );
onChange(v_min, );
onChange(h_max, );
onChange(s_max, );
onChange(v_max, ); waitKey();
}

三、颜色识别跟踪

putText函数定义为

void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, intthickness=1, int lineType=8, bool bottomLeftOrigin=false )

参数为

  • img – 图像矩阵
  • text – string型 文字内容
  • org – 文字坐标,以左下角为原点
  • fontFace – 字体类型  (包括 FONT_HERSHEY_SIMPLEXFONT_HERSHEY_PLAINFONT_HERSHEY_DUPLEXFONT_HERSHEY_COMPLEXFONT_HERSHEY_TRIPLEXFONT_HERSHEY_COMPLEX_SMALLFONT_HERSHEY_SCRIPT_SIMPLEX, or FONT_HERSHEY_SCRIPT_COMPLEX,)
  • fontScale –字体大小
  • color – 字体颜色
  • thickness – 字体粗细
  • lineType – Line type. See the line for details.
  • bottomLeftOrigin – When true, the image data origin is at the bottom-left corner. Otherwise, it is at the top-left corner.
 #include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std; ///green hsv min value
int h_min = ;
int s_min = ;
int v_min = ;
///green hsv max value
int h_max = ;
int s_max = ;
int v_max = ; void main()
{
//识别图片中颜色物体
Mat srcImg = imread("E://rgb.jpg");
imshow("src", srcImg);
Mat dstImg = srcImg.clone();
Mat hsv_img; //存储HSV图像
cvtColor(srcImg,hsv_img,CV_BGR2HSV); Scalar hsv_min(h_min,s_min,v_min);
Scalar hsv_max(h_max, s_max, v_max);
Mat hsv_green=Mat::zeros(srcImg.size(),CV_8U);
inRange(hsv_img, hsv_min, hsv_max, hsv_green);
medianBlur(hsv_green, hsv_green, );//中值滤波
imshow("hsv_green", hsv_green); //找轮廓
vector<vector<Point>>contours;
vector<Vec4i>hierarcy;
//找外层轮廓
findContours(hsv_green, contours, hierarcy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
vector<Rect>boundRect(contours.size());
//遍历每个轮廓
for (int i = ; i < contours.size(); i++)
{
boundRect[i] = boundingRect(Mat(contours[i]));//计算外接矩形
//top、left、right、bottom tl左上 br右下
rectangle(dstImg,boundRect[i].tl(), boundRect[i].br(),Scalar(,,),,);
//Point org = boundRect[i].tl();
Point org = boundRect[i].br();
putText(dstImg,"green",org,CV_FONT_HERSHEY_SIMPLEX,1.2f,CV_RGB(,,),,);
}
imshow("result", dstImg); waitKey();
}

视频颜色跟踪

 #include "opencv2/opencv.hpp"
using namespace cv; //设置HSV颜色区间
int blue_min_h = ;
int blue_min_s = ;
int blue_min_v = ;
int blue_max_h = ;
int blue_max_s = ;
int blue_max_v = ; int green_min_h = ;
int green_min_s = ;
int green_min_v = ;
int green_max_h = ;
int green_max_s = ;
int green_max_v = ; int red_min_h = ;
int red_min_s = ;
int red_min_v = ;
int red_max_h = ;
int red_max_s = ;
int red_max_v = ; void main()
{
VideoCapture cap;
cap.open("E://1.mp4");
if (!cap.isOpened())//如果视频不能正常打开则返回
return;
Mat src,dst,hsv,ROI; while ()
{
cap >> src;
if (src.empty())//如果某帧为空则退出循环
break;
//imshow("video", src);
dst = src.clone();
ROI=src(Rect(,,,));//x,y,w,h xy坐标,宽度,高度 区分蓝色按钮和右边的蓝色区域
GaussianBlur(ROI,ROI,Size(,),);
cvtColor(ROI, hsv, CV_BGR2HSV);
Scalar blue_min(blue_min_h, blue_min_s, blue_min_v);
Scalar blue_max(blue_max_h, blue_max_s, blue_max_v);
Scalar green_min(green_min_h, green_min_s, green_min_v);
Scalar green_max(green_max_h, green_max_s, green_max_v);
Scalar red_min(red_min_h, red_min_s, red_min_v);
Scalar red_max(red_max_h, red_max_s, red_max_v);
Mat hsv_blue = Mat::zeros(src.size(), CV_8U);
Mat hsv_green = Mat::zeros(src.size(), CV_8U);
Mat hsv_red = Mat::zeros(src.size(), CV_8U);
inRange(hsv, blue_min, blue_max, hsv_blue);//颜色区间范围筛选
inRange(hsv, green_min, green_max, hsv_green);
inRange(hsv, red_min, red_max, hsv_red);
medianBlur(hsv_blue, hsv_blue, );//中值滤波
medianBlur(hsv_green, hsv_green, );
medianBlur(hsv_red, hsv_red, ); //找轮廓
vector<vector<Point>>contours_blue,contours_green,contours_red;
vector<Vec4i>hierarchy_blue,hierarchy_green,hierarchy_red;
//蓝色轮廓
findContours(hsv_blue, contours_blue, hierarchy_blue, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
vector<Rect>boundRect_blue(contours_blue.size());//定义外接矩形集合
for (int i = ; i < contours_blue.size(); i++)
{
boundRect_blue[i] = boundingRect(Mat(contours_blue[i]));//计算外接矩形
rectangle(dst, boundRect_blue[i].tl(), boundRect_blue[i].br(), Scalar(, , ), , );
Point org = boundRect_blue[i].br();
putText(dst, "blue", org, CV_FONT_HERSHEY_SIMPLEX, 1.2f, CV_RGB(,,), , );
}
//绿色轮廓
findContours(hsv_green, contours_green, hierarchy_green, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
vector<Rect>boundRect_green(contours_green.size());//定义外接矩形集合
for (int i = ; i < contours_green.size(); i++)
{
boundRect_green[i] = boundingRect(Mat(contours_green[i]));//计算外接矩形
rectangle(dst, boundRect_green[i].tl(), boundRect_green[i].br(), Scalar(, , ), , );
Point org = boundRect_green[i].br();
putText(dst, "green", org, CV_FONT_HERSHEY_SIMPLEX, 1.2f, CV_RGB(, , ), , );
}
//红色轮廓
findContours(hsv_red, contours_red, hierarchy_red, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
vector<Rect>boundRect_red(contours_red.size());//定义外接矩形集合
for (int i = ; i < contours_red.size(); i++)
{
boundRect_red[i] = boundingRect(Mat(contours_red[i]));//计算外接矩形
rectangle(dst, boundRect_red[i].tl(), boundRect_red[i].br(), Scalar(, , ), , );
Point org = boundRect_red[i].br();
putText(dst, "red", org, CV_FONT_HERSHEY_SIMPLEX, 1.2f, CV_RGB(,,), , );
} imshow("result", dst);
waitKey();//每帧延时20毫秒
}
cap.release();//释放资源
}

opencv学习之路(29)、轮廓查找与绘制(八)——轮廓特征属性及应用的更多相关文章

  1. opencv学习之路(23)、轮廓查找与绘制(二)——访问轮廓每个点

    一.简介 二.画出每个轮廓的每个点 #include "opencv2/opencv.hpp" using namespace cv; void main() { Mat src= ...

  2. opencv学习之路(22)、轮廓查找与绘制(一)

    一.简介 图2 二.代码 #include"opencv2/opencv.hpp" #include<iostream> using namespace std; us ...

  3. opencv学习之路(28)、轮廓查找与绘制(七)——位置关系及轮廓匹配

    一.点与轮廓的距离及位置关系 #include "opencv2/opencv.hpp" #include <iostream> using namespace std ...

  4. opencv学习之路(27)、轮廓查找与绘制(六)——外接圆、椭圆拟合、逼近多边形曲线、计算轮廓面积及长度、提取不规则轮廓

    一.最小外接圆 #include "opencv2/opencv.hpp" #include<iostream> using namespace std; using ...

  5. opencv学习之路(25)、轮廓查找与绘制(四)——正外接矩形

    一.简介 二.外接矩形的查找绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //外接矩形的查找 ...

  6. opencv学习之路(24)、轮廓查找与绘制(三)——凸包

    一.简介 二.绘制点集的凸包 #include<opencv2/opencv.hpp> using namespace cv; void main() { //---绘制点集的凸包 Mat ...

  7. opencv学习之路(26)、轮廓查找与绘制(五)——最小外接矩形

    一.简介 二.轮廓最小外接矩形的绘制 #include "opencv2/opencv.hpp" using namespace cv; void main() { //轮廓最小外 ...

  8. opencv学习之路(39)、PCA

    一.PCA理论介绍 网上已经有许多介绍pca原理的博客,这里就不重复介绍了.详情可参考 http://blog.csdn.net/zhongkelee/article/details/44064401 ...

  9. opencv学习之路(37)、运动物体检测(二)

    一.运动物体轮廓椭圆拟合及中心 #include "opencv2/opencv.hpp" #include<iostream> using namespace std ...

随机推荐

  1. Windows 上编译 corefx 源码生成 Linux 上可用的 System.Data.SqlClient.dll

    最近在排查一个奇怪的 EF Core 查询速度慢的问题,需要在 corefx 2.2.3 的 System.Data.SqlClient 源码中打点. github 上签出 corefx 的源代码,运 ...

  2. python opencv 读取USB摄像头的像素问题

    问题描述 每次调用capture读取video的时候,还回的像素都是640x480,不管是笔记本的摄像头还是USB摄像头,明明我的摄像头是支持130万读取的功能的呀. 问题分析 一番查找,关于用ope ...

  3. appium api笔记

    打印上下文driver.contexts打印当前上下文driver.contextdriver.current_context切换上下文driver.switch_to.context('WEBVIE ...

  4. [dev]typeof, offsetof 和container_of

    转一篇文章.写的比较好,浅显易懂,还画了图. https://www.cnblogs.com/idorax/p/6796897.html 概况一下: container_of用到了typeof和off ...

  5. Android的SQlite的使用

    Android系统集成了一个轻量级的数据库:SQlite.SQlite不像Oracle.MySQl数据库那样需要安装.启动服务器进程,SQLite数据库只是一个文件 实例1:向数据库里插入数据 主界面 ...

  6. WebSocket(一)-RFC6455

    1.官方在线 本地下载 参考翻译:gitbook

  7. 2018-2019-2 网络对抗技术 20165225 Exp3 免杀原理与实践

    2018-2019-2 网络对抗技术 20165225 Exp3 免杀原理与实践 一.实验说明 1.1 正确使用msf编码器(0.5分),msfvenom生成如jar之类的其他文件(0.5分),vei ...

  8. Redis的数据结构之sorted-set

    存储Sorted-Set Sorted-Set和Set的区别 Sorted-Set中的成员在集合中的位置是有序的 存储Sorted-set常用命令 添加元素 获得元素 删除元素 范围查询 扩展命令 z ...

  9. 关于 RESTful API 中 HTTP 状态码的定义

    最近正好使用了一会儿 Koa ,在这说一下自己对各个 请求码的见解和使用场景,懒人直接看 200.400.401.403.404.500 就可以了. 其中 2XX/3XX 其实都是请求成功,但是结果不 ...

  10. 【LeetCode每天一题】Permutation Sequence(排列序列)

    The set [1,2,3,...,n] contains a total of n! unique permutations.By listing and labeling all of the ...