前言

项目车号识别过程中,车体有三种颜色黑车黑底白字、红车红底白字、绿车黄底绿字,可以通过判断车体的颜色信息,从而判断二值化是否需要反转,主要是基于rgb2hsv函数进行不同颜色的阈值判断。

matlab代码可参考:

http://www.cnblogs.com/happyamyhope/p/6650920.html

与matlab中的rgb2hsv函数功能相同的opencv代码:

  1. vector<Mat> rgb2hsv(Mat image){
  2. vector<Mat> image_rgb;
  3. vector<Mat> hsv();
  4. split(image, image_rgb);
  5. Mat B = (Mat_<double>)image_rgb.at() / ;
  6. Mat G = (Mat_<double>)image_rgb.at() / ;
  7. Mat R = (Mat_<double>)image_rgb.at() / ;
  8. Mat_<double> H(image.rows, image.cols, );
  9. Mat_<double> S(image.rows, image.cols, );
  10. Mat_<double> V(image.rows, image.cols, );
  11.  
  12. for (int m = ; m <image.rows; m++)
  13. {
  14. for (int n = ; n < image.cols; n++)
  15. {
  16. double var_B = B.at<double>(m, n);//image.at<cv::Vec3b>(j,i)[0];;B.data[m, n]
  17. double var_G = G.at<double>(m, n);
  18. double var_R = R.at<double>(m, n);
  19. //double var_Min=0;
  20. //double var_Max=100;
  21. double var_Min = min(var_R, min(var_G, var_B)); //Min. value of RGB
  22. double var_Max = max(var_R, max(var_G, var_B)); //Max. value of RGB
  23. double del_Max = var_Max - var_Min; //Delta RGB value
  24. V.at<double>(m, n) = var_Max;
  25.  
  26. if (del_Max == 0.0) //This is a gray, no chroma...
  27. {
  28. H.at<double>(m, n) = 0.0; //HSV results from 0 to 1
  29. S.at<double>(m, n) = 0.0;
  30. }
  31. else //Chromatic data...
  32. {
  33. if (var_Max == 0.0)
  34. {
  35. S.at<double>(m, n) = 0.0;
  36. }
  37. else{
  38. S.at<double>(m, n) = del_Max / var_Max;
  39. }
  40.  
  41. if (var_R == var_Max) H.at<double>(m, n) = (var_G - var_B) / del_Max;
  42. else if (var_G == var_Max) H.at<double>(m, n) = + (var_B - var_R) / del_Max;
  43. else if (var_B == var_Max) H.at<double>(m, n) = + (var_R - var_G) / del_Max;
  44.  
  45. H.at<double>(m, n) /= ;
  46. if (H.at<double>(m, n) < ) H.at<double>(m, n) += 1.0;
  47.  
  48. }
  49.  
  50. }
  51.  
  52. } // end for
  53. hsv.at() = H;
  54. hsv.at() = S;
  55. hsv.at() = V;
  56. return hsv;
  57.  
  58. }

子函数程序代码:

  1. bool isGreen(Mat image){
  2.  
  3. vector< Mat > hsv_vec;//Mat M(7,7,CV_32FC2,Scalar(1,3));
  4.  
  5. //判断图像非空
  6. if (image.channels() < )
  7. {
  8. std::cout << "ROI Image Error! " << std::endl;
  9. return false;
  10. }
  11.  
  12. ofstream outfile("E:\\carriage_recognition\\train_identification\\ROI1095\\HSV.xls");
  13. Mat h = hsv_vec.at()*;
  14. Mat s = hsv_vec.at()*;
  15. Mat v = hsv_vec.at()*;
  16.  
  17. unsigned int green = ;
  18. unsigned int yellow = ;
  19. double hout = ;
  20. double sout = ;
  21. double vout = ;
  22. double ratio_g = ;
  23. double ratio = ;
  24. for (int m = ; m < image.rows; m++)
  25. {
  26. for (int n = ; n < image.cols; n++)
  27. {
  28.  
  29. hout = h.at<double>(m, n);
  30. sout = s.at<double>(m, n);
  31. vout = v.at<double>(m, n);
  32. if ((hout >= && hout <= ) && (sout >= ) && (vout >= ))
  33. green++;
  34. else if ((hout >= && hout <= ) && (sout >= ) && (vout >= ))
  35. yellow++;
  36. //cout << m << "\t" << n << "\t" << hout << "\t" << sout << "\t" << vout << endl;
  37. outfile << m << "\t" << n << "\t" << hout << "\t" << sout << "\t" << vout << "\t";
  38. outfile << endl;
  39. }
  40. //outfile << endl;
  41. }
  42. ratio_g = (double)green * / (image.rows*image.cols);
  43. ratio = (double)(green + yellow) * / (image.rows*image.cols);
  44.  
  45. if ( ratio > 0.04 && ratio_g > 0.0004 )
  46. return true;
  47. else
  48. return false;
  49.  
  50. }

主程序代码:

  1. /************************************************************************
  2. * Copyright(c) 2016 ZRJ
  3. * All rights reserved.
  4. *
  5. * File: isGreen.cpp
  6. * Brief:
  7. * Version: 1.0
  8. * Author: ZRJ
  9. * Email: happyamyhope@163.com
  10. * Date: 2017/03/29
  11. * History:
  12. * 20170329: 颜色识别;
  13.  
  14. ************************************************************************/
  15. //-------------------------------------------------------------------------
  16. //头文件
  17. #include <iostream>
  18. #include <vector>
  19. #include<time.h>
  20. #include <fstream>
  21. #include "opencv2/highgui/highgui.hpp"
  22. #include "opencv2/imgproc/imgproc.hpp"
  23.  
  24. using namespace cv;
  25. using namespace std;
  26.  
  27. //-----------------------------------------------------------------------
  28. //调参
  29.  
  30. //---------------------------------------------------------------------------------
  31. //函数声明
  32. bool isGreen(Mat image);
  33. vector<Mat> rgb2hsv(Mat image);
  34. //-----------------------------------------------------------------------------------------
  35. //函数定义
  36. int main(int argc, char** argv)
  37. {
  38. char image_path[];
  39. char green_path[];
  40. ///处理图像
  41.  
  42. for (int i = ; i <= ; i++)
  43. {
  44. //获取图像帧
  45. cout << i << endl;
  46. sprintf(image_path, "E:\\carriage_recognition\\train_identification\\ROI1095\\ROI原图\\%d_number_ROI.png", i);
  47. sprintf(green_path, "E:\\carriage_recognition\\train_identification\\ROI1095\\green原图\\%d_number_ROI.png", i);
  48. Mat image = imread(image_path, );
  49. bool flag = isGreen( image );
  50. if ( flag )
  51. imwrite(green_path, image);
  52.  
  53. }//end for
  54. //clock_t end = clock();
  55. //double interval = (double)(end - begin) / CLOCKS_PER_SEC;
  56. //cout << "处理图像耗时: " << interval << endl;
  57. return ;
  58.  
  59. }

问题总结:

1.opencv中的cvtColor(image, hsv, CV_BGR2HSV, 0);语句与matlab函数的输出数据类型有些微差别;

2.自己编写的rgb2hsv函数的运行速度很慢,难以保证实际场景的实时性,后续需要优化;

3.rgb2hsv的公式转换问题,需要仔细研读matlab函数代码;

也可参考:http://www.easyrgb.com/index.php?X=MATH&H=20#text20

4.将数据保存在.xls中,方便与matlab的输出结果进行比较;

判断颜色信息-RGB2HSV(opencv)的更多相关文章

  1. 判断颜色信息-RGB2HSV

    前言 项目车号识别过程中,车体有三种颜色黑车黑底白字.红车红底白字.绿车黄底绿字,可以通过判断车体的颜色信息,从而判断二值化是否需要反转,主要是基于rgb2hsv函数进行不同颜色的阈值判断. MATL ...

  2. Kinect SDK(1):读取彩色、深度、骨骼信息并用OpenCV显示

    Kinect SDK 读取彩色.深度.骨骼信息并用OpenCV显示 一.原理说明 对于原理相信大家都明白大致的情况,因此,在此只说比较特别的部分. 1.1 深度流数据: 深度数据流所提供的图像帧中,每 ...

  3. .NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度

    .NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度   随机颜色在日常开发中很常用到,有时候要控制颜色明亮度,比如在白色背景网页上的随机颜色,一般要求颜色稍微暗一 ...

  4. JAVASCRIPT和JQUERY判断浏览器信息总汇(备忘)

    <script type="text/javascript">        //jquery判断浏览器信息        $(function(){          ...

  5. JS 通过 navigator获取判断浏览器信息

    获取浏览器信息需要使用navigator.userAgent 对象 根据获取到的内容判断浏览器信息 亲身测试 navigator.userAgent IE 11  Mozilla/5.0 (Windo ...

  6. 提取bmp图片的颜色信息,可直接framebuffer显示(c版本与python版本)

    稍微了解了下linux的framebuffer,这是一种很简单的显示接口,直接写入像素信息即可 配置好的内核,会有/dev/fbn 的接口,于是想能否提前生成一个文件,比如logo.fb,里面仅包含像 ...

  7. 使用dcmtk库读取.dcm文件并获取信息+使用OpenCV显示图像

    借助VS2013和OpenCV的绘图功能,在工程DICOMReader.sln中实现了对单张.dcm图像的读取与显示,以下是详细步骤. 前期准备工作 编译器:VS2013 库:dcmtk-3.6.0( ...

  8. 图片模糊度判断程序(C++、opencv)

    //#include<opencv2\opencv.hpp> //using namespace cv; #include <opencv2/core/core.hpp> #i ...

  9. python脚本实例001 - 通过列表内容判断输入输出信息

    要点总结: 输入输出方法,input().print()方法 list列表应用,list是一种有序的集合,可以随时添加和删除其中的元素. 条件语句if-else应用 #! /usr/bin/pytho ...

随机推荐

  1. 安装Zookeeper和kafka,安装完毕后,遇到的错误

    按照原文链接 http://www.cnblogs.com/swneng/p/10212460.html 在windows下进行安装 之后运行 D:\00H_Bigdata\kafka_2.11-2. ...

  2. Codeforces 525A - Vitaliy and Pie

    525A - Vitaliy and Pie 思路:贪心+hashing. 代码: #include<bits/stdc++.h> using namespace std; string ...

  3. Python - WebDriver 识别登录验证码

    Python - WebDriver 识别登录验证码 没什么可说的直接上代码! #-*-coding:utf-8-*- # Time:2017/9/29 7:16 # Author:YangYangJ ...

  4. Python - PIL-pytesseract-tesseract验证码识别

    N天前实现了简单的验证识别,这玩意以前都觉得是高大上的东西,一直没有去研究,这次花了点时间研究了一下,当然只是一些基础的东西,高深的我也不会,分享一下给大家吧. 关于python验证码识别库,网上主要 ...

  5. python打印ms

    ct打印的是时间戳,时间戳的小数点后前三位为ms  eg:1555644362.055328   ms = 055 import time ct = time.time() local_time = ...

  6. English trip -- VC(情景课)10 C I like to watch TV. 我爱看电视

    Grammar focus 语法点: like to do    you do    they What  does  he    like to do? does  she Practice 练习 ...

  7. 20170708xlVBA添加新产品修改公式

    Sub ControlInsertProduct() Dim Wb As Workbook Dim OneSht As Worksheet Dim Arr As Variant Dim i As Lo ...

  8. php--------合并2个数字键数组的值

    开发中遇到了,数组合并并去除重复这个功能,查阅资料, 找到了一个方法,分享一下. <?php /** * PHP合并2个数字键数组的值 * * @param array $arr1 * @par ...

  9. Android 7.0正式版工厂镜像下载

    Android 7.0正式版工厂镜像下载 从3月份上线首个开发者预览版(Developer Preview)之后,经过近6个月时间的打磨,谷歌今天开始向Nexus设备推送Android 7.0 Nou ...

  10. Nginx+uWsgi生产部署Django

    部署得过程很简单,部署得核心在于,为什么要这样做,每一个参数代表什么意思,最终的目的是得了解,一些基概念性的东西. uWsgi简介 说Uwsgi之前,先说一下Wsgi. 什么是Wsgi? WSGI: ...