前言

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

matlab代码可参考:

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

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

vector<Mat> rgb2hsv(Mat image){
vector<Mat> image_rgb;
vector<Mat> hsv();
split(image, image_rgb);
Mat B = (Mat_<double>)image_rgb.at() / ;
Mat G = (Mat_<double>)image_rgb.at() / ;
Mat R = (Mat_<double>)image_rgb.at() / ;
Mat_<double> H(image.rows, image.cols, );
Mat_<double> S(image.rows, image.cols, );
Mat_<double> V(image.rows, image.cols, ); for (int m = ; m <image.rows; m++)
{
for (int n = ; n < image.cols; n++)
{
double var_B = B.at<double>(m, n);//image.at<cv::Vec3b>(j,i)[0];;B.data[m, n]
double var_G = G.at<double>(m, n);
double var_R = R.at<double>(m, n);
//double var_Min=0;
//double var_Max=100;
double var_Min = min(var_R, min(var_G, var_B)); //Min. value of RGB
double var_Max = max(var_R, max(var_G, var_B)); //Max. value of RGB
double del_Max = var_Max - var_Min; //Delta RGB value
V.at<double>(m, n) = var_Max; if (del_Max == 0.0) //This is a gray, no chroma...
{
H.at<double>(m, n) = 0.0; //HSV results from 0 to 1
S.at<double>(m, n) = 0.0;
}
else //Chromatic data...
{
if (var_Max == 0.0)
{
S.at<double>(m, n) = 0.0;
}
else{
S.at<double>(m, n) = del_Max / var_Max;
} if (var_R == var_Max) H.at<double>(m, n) = (var_G - var_B) / del_Max;
else if (var_G == var_Max) H.at<double>(m, n) = + (var_B - var_R) / del_Max;
else if (var_B == var_Max) H.at<double>(m, n) = + (var_R - var_G) / del_Max; H.at<double>(m, n) /= ;
if (H.at<double>(m, n) < ) H.at<double>(m, n) += 1.0; } } } // end for
hsv.at() = H;
hsv.at() = S;
hsv.at() = V;
return hsv; }

子函数程序代码:

bool isGreen(Mat image){

    vector< Mat > hsv_vec;//Mat M(7,7,CV_32FC2,Scalar(1,3));  

    //判断图像非空
if (image.channels() < )
{
std::cout << "ROI Image Error! " << std::endl;
return false;
} ofstream outfile("E:\\carriage_recognition\\train_identification\\ROI1095\\HSV.xls");
Mat h = hsv_vec.at()*;
Mat s = hsv_vec.at()*;
Mat v = hsv_vec.at()*; unsigned int green = ;
unsigned int yellow = ;
double hout = ;
double sout = ;
double vout = ;
double ratio_g = ;
double ratio = ;
for (int m = ; m < image.rows; m++)
{
for (int n = ; n < image.cols; n++)
{ hout = h.at<double>(m, n);
sout = s.at<double>(m, n);
vout = v.at<double>(m, n);
if ((hout >= && hout <= ) && (sout >= ) && (vout >= ))
green++;
else if ((hout >= && hout <= ) && (sout >= ) && (vout >= ))
yellow++;
//cout << m << "\t" << n << "\t" << hout << "\t" << sout << "\t" << vout << endl;
outfile << m << "\t" << n << "\t" << hout << "\t" << sout << "\t" << vout << "\t";
outfile << endl;
}
//outfile << endl;
}
ratio_g = (double)green * / (image.rows*image.cols);
ratio = (double)(green + yellow) * / (image.rows*image.cols); if ( ratio > 0.04 && ratio_g > 0.0004 )
return true;
else
return false; }

主程序代码:

/************************************************************************
* Copyright(c) 2016 ZRJ
* All rights reserved.
*
* File: isGreen.cpp
* Brief:
* Version: 1.0
* Author: ZRJ
* Email: happyamyhope@163.com
* Date: 2017/03/29
* History:
* 20170329: 颜色识别; ************************************************************************/
//-------------------------------------------------------------------------
//头文件
#include <iostream>
#include <vector>
#include<time.h>
#include <fstream>
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp" using namespace cv;
using namespace std; //-----------------------------------------------------------------------
//调参 //---------------------------------------------------------------------------------
//函数声明
bool isGreen(Mat image);
vector<Mat> rgb2hsv(Mat image);
//-----------------------------------------------------------------------------------------
//函数定义
int main(int argc, char** argv)
{
char image_path[];
char green_path[];
///处理图像 for (int i = ; i <= ; i++)
{
//获取图像帧
cout << i << endl;
sprintf(image_path, "E:\\carriage_recognition\\train_identification\\ROI1095\\ROI原图\\%d_number_ROI.png", i);
sprintf(green_path, "E:\\carriage_recognition\\train_identification\\ROI1095\\green原图\\%d_number_ROI.png", i);
Mat image = imread(image_path, );
bool flag = isGreen( image );
if ( flag )
imwrite(green_path, image); }//end for
//clock_t end = clock();
//double interval = (double)(end - begin) / CLOCKS_PER_SEC;
//cout << "处理图像耗时: " << interval << endl;
return ; }

问题总结:

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. STL_std::iterator

    1. VC6里面 看到,std::iterator 就是一个指针,但是 vs2010中貌似不是这样(感觉像是一个类...具体是啥还不太确定...)... 2.

  2. 《剑指offer》第三十四题(二叉树中和为某一值的路径)

    // 面试题34:二叉树中和为某一值的路径 // 题目:输入一棵二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所 // 有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径. #i ...

  3. Python -- Scrapy 命令行工具(command line tools)

    结合scrapy 官方文档,进行学习,并整理了部分自己学习实践的内容 Scrapy是通过 scrapy 命令行工具进行控制的. 这里我们称之为 “Scrapy tool” 以用来和子命令进行区分. 对 ...

  4. Python 爬虫-正则表达式(补)

    2017-08-08 18:37:29 一.Python中正则表达式使用原生字符串的几点说明 原生字符串和普通字符串的不同 相较于普通字符串,原生字符串中的\就是反斜杠,并不表达转义.不过,字符串转成 ...

  5. Tomcat 中文乱码 设置UTF-8编码 问题解决办法

    在Java Web开发中,http请求带有中文字符的URI如果不处理容易出现乱码问题:这是因为Tomcat容器默认编码是iso-8859-1引起的,因此要避免出现乱码就要需要做相应的处理.解决办法如下 ...

  6. 雷林鹏分享:C# 多态性

    C# 多态性 多态性意味着有多重形式.在面向对象编程范式中,多态性往往表现为"一个接口,多个功能". 多态性可以是静态的或动态的.在静态多态性中,函数的响应是在编译时发生的.在动态 ...

  7. js-Client-side web APIs

    APIs https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Client-side_web_APIs/ 简介: 应用程序接口(API) ...

  8. 3-23Agile Web Development,3-24(chapter: 6)

    第2章 Instant Gratification 复习 和 练习第一章,新建rails web页面. 重点: 知道了类,方法,实例变量 在rails是怎么用的. rails generate con ...

  9. Confluence 6 使用 LDAP 授权连接到 Confluence 内部目录

    希望连接一个内部目录但是使用 LDAP 检查登录授权: 在屏幕的右上角单击 控制台按钮 ,然后选择 General Configuration 链接. 单击左侧面板上面的 用户目录(User Dire ...

  10. Bash and a Tough Math Puzzle CodeForces - 914D (线段树二分)

    大意:给定序列, 单点修改, 区间询问$[l,r]$内修改至多一个数后$gcd$能否为$x$ 这题比较有意思了, 要注意到询问等价于$[l,r]$内最多有1个数不为$x$的倍数 可以用线段树维护gcd ...