zoukankan      html  css  js  c++  java
  • 30、【opencv入门】轮廓查找与绘制(8)——轮廓特征属性及应用

    一、简介

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

      HSV颜色空间与人眼所看色彩较接近, 故常用于颜色检测与识别。其中H(色调)、S(饱和度)、V(亮度)

      H---不同的颜色(红色/绿色/蓝色)---范围: 0~360

      S---颜色深浅(浅红/深红)---范围: 0.0~1.0

      V---颜色亮暗(暗红/亮红)---范围: 0.0~1.0

    OpenCV默认的HSV范围分别是: H: 0~180,  S: 0~255,  V: 0~255

    2、相关知识点

    颜色空间转换---cvtColor()

    cvtColor(srcImg, hsv_img, CV_BGR2HSV);//转换到HSV颜色

    颜色区间范围删选---inRange()

    1 CV_EXPORTS_W void inRange(InputArray src, InputArray lowreb, InputArray upperb, OutputArray dst);

      src: 输入原图或数组

      lowerb: 低边界或者颜色阈值

      upperb: 高边界或者颜色阈值

      dst: 输出目标图像, 需要和原图一样的size并且类型需为CV_8U

     示例:

    1 Scalar hsv_min(h_min, s_min, v_min);
    2 Scalar hsv_max(h_max, s_max, v_max);
    3 Mat dstImg = Mat::zeros(srcImg.rows, srcImg.cols, CV_8U):
    4 inRange(hsv_img, hsv_min, hsv_max, dstImg);

     二、HSV滑动条

     1 //HSV滑动条
     2 #include "opencv2/opencv.hpp"
     3 #include <iostream>
     4 
     5 using namespace cv;
     6 using namespace std;
     7 
     8 Mat srcImg, hsv_img;
     9 int h_min =0,s_min = 0,v_min = 0;
    10 int h_max = 180,s_max = 255,v_max = 46;
    11 
    12 void onChange(int, void* param) {
    13     Scalar hsv_min(h_min, s_min, v_min);
    14     Scalar hsv_max(h_max, s_max, v_max);
    15     Mat dst = Mat::zeros(srcImg.size(), srcImg.type());
    16     inRange(srcImg, hsv_min, hsv_max, dst);
    17     imshow("HSV", dst);
    18 }
    19 
    20 
    21 int main()
    22 {
    23     srcImg = imread("2.jpg");
    24     imshow("src", srcImg);
    25     cvtColor(srcImg, hsv_img, CV_BGR2HSV); //BGR转到HSV颜色空间
    26     namedWindow("HSV", CV_WINDOW_AUTOSIZE); 
    27     //创建滚动条
    28     createTrackbar("h_min", "HSV", &h_min, 180, onChange, 0);
    29     createTrackbar("s_min", "HSV", &s_min, 255, onChange, 0);
    30     createTrackbar("v_min", "HSV", &v_min, 255, onChange, 0);
    31     createTrackbar("h_max", "HSV", &h_max, 180, onChange, 0);
    32     createTrackbar("s_max", "HSV", &s_max, 255, onChange, 0);
    33     createTrackbar("v_max", "HSV", &v_max, 255, onChange, 0);
    34     //回调函数初始化
    35     onChange(h_min, 0);
    36     onChange(s_min, 0);
    37     onChange(v_min, 0);
    38     onChange(h_max, 0);
    39     onChange(s_max, 0);
    40     onChange(v_max, 0);
    41 
    42     waitKey(0);
    43     return 0;
    44 }

    三、颜色识别跟踪

    putText函数定义为

    1 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_DUPLEX,

     FONT_HERSHEY_COMPLEX, FONT_HERSHEY_TRIPLEX, FONT_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.

     1 //颜色的识别跟踪
     2 #include "opencv2/opencv.hpp"
     3 #include <iostream>
     4 
     5 using namespace cv;
     6 using namespace std;
     7 
     8 ///green hsv min value
     9 int h_min = 35;
    10 int s_min = 110;
    11 int v_min = 106;
    12 ///green hsv max value
    13 int h_max = 77;
    14 int s_max = 255;
    15 int v_max = 255;
    16 
    17 int main()
    18 {
    19     //识别图片中颜色物体
    20     Mat srcImg = imread("rgb.jpg");
    21     imshow("src", srcImg);
    22     Mat dstImg = srcImg.clone();
    23     Mat hsv_img;  //存储HSV图像
    24     cvtColor(srcImg,hsv_img,CV_BGR2HSV);
    25 
    26     Scalar hsv_min(h_min,s_min,v_min);
    27     Scalar hsv_max(h_max, s_max, v_max);
    28     Mat hsv_green=Mat::zeros(srcImg.size(),CV_8U);
    29     inRange(hsv_img, hsv_min, hsv_max, hsv_green);
    30     medianBlur(hsv_green, hsv_green, 5);//中值滤波
    31     imshow("hsv_green", hsv_green);
    32 
    33     //找轮廓
    34     vector<vector<Point>>contours;
    35     vector<Vec4i>hierarcy;
    36     //找外层轮廓
    37     findContours(hsv_green, contours, hierarcy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
    38     vector<Rect>boundRect(contours.size());
    39     //遍历每个轮廓
    40     for (int i = 0; i < contours.size(); i++)
    41     {
    42         boundRect[i] = boundingRect(Mat(contours[i]));//计算外接矩形
    43         //top、left、right、bottom    tl左上    br右下
    44         rectangle(dstImg,boundRect[i].tl(), boundRect[i].br(),Scalar(0,255,255),2,8);
    45         //Point org = boundRect[i].tl();
    46         Point org = boundRect[i].br();
    47         putText(dstImg,"green",org,CV_FONT_HERSHEY_SIMPLEX,1.2f,CV_RGB(0,255,0),2,8);
    48     }
    49     imshow("result", dstImg);
    50 
    51     waitKey(0);
    52     return 0;
    53 }
  • 相关阅读:
    Linux下查看使用的是哪种shell的方法汇总【转】
    Shell中的while循环【转】
    shell浅谈之三for、while、until循环【转】
    cpu_relax( )-----对自选循环等待(spin-wait loops)操作的优化【转】
    Linux makefile 教程 非常详细,且易懂【转】
    链表常见的问题【转】
    linux内核同步之信号量、顺序锁、RCU、完成量、关闭中断【转】
    linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】
    关于hrtimer_forward小段代码的分析【转】
    CTP多点触摸协议【转】
  • 原文地址:https://www.cnblogs.com/Long-w/p/9668962.html
Copyright © 2011-2022 走看看