判断颜色信息-RGB2HSV(opencv)
前言
项目车号识别过程中,车体有三种颜色黑车黑底白字、红车红底白字、绿车黄底绿字,可以通过判断车体的颜色信息,从而判断二值化是否需要反转,主要是基于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)的更多相关文章
- 判断颜色信息-RGB2HSV
前言 项目车号识别过程中,车体有三种颜色黑车黑底白字.红车红底白字.绿车黄底绿字,可以通过判断车体的颜色信息,从而判断二值化是否需要反转,主要是基于rgb2hsv函数进行不同颜色的阈值判断. MATL ...
- Kinect SDK(1):读取彩色、深度、骨骼信息并用OpenCV显示
Kinect SDK 读取彩色.深度.骨骼信息并用OpenCV显示 一.原理说明 对于原理相信大家都明白大致的情况,因此,在此只说比较特别的部分. 1.1 深度流数据: 深度数据流所提供的图像帧中,每 ...
- .NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度
.NET C#生成随机颜色,可以控制亮度,生成暗色或者亮色 基于YUV模式判断颜色明亮度 随机颜色在日常开发中很常用到,有时候要控制颜色明亮度,比如在白色背景网页上的随机颜色,一般要求颜色稍微暗一 ...
- JAVASCRIPT和JQUERY判断浏览器信息总汇(备忘)
<script type="text/javascript"> //jquery判断浏览器信息 $(function(){ ...
- JS 通过 navigator获取判断浏览器信息
获取浏览器信息需要使用navigator.userAgent 对象 根据获取到的内容判断浏览器信息 亲身测试 navigator.userAgent IE 11 Mozilla/5.0 (Windo ...
- 提取bmp图片的颜色信息,可直接framebuffer显示(c版本与python版本)
稍微了解了下linux的framebuffer,这是一种很简单的显示接口,直接写入像素信息即可 配置好的内核,会有/dev/fbn 的接口,于是想能否提前生成一个文件,比如logo.fb,里面仅包含像 ...
- 使用dcmtk库读取.dcm文件并获取信息+使用OpenCV显示图像
借助VS2013和OpenCV的绘图功能,在工程DICOMReader.sln中实现了对单张.dcm图像的读取与显示,以下是详细步骤. 前期准备工作 编译器:VS2013 库:dcmtk-3.6.0( ...
- 图片模糊度判断程序(C++、opencv)
//#include<opencv2\opencv.hpp> //using namespace cv; #include <opencv2/core/core.hpp> #i ...
- python脚本实例001 - 通过列表内容判断输入输出信息
要点总结: 输入输出方法,input().print()方法 list列表应用,list是一种有序的集合,可以随时添加和删除其中的元素. 条件语句if-else应用 #! /usr/bin/pytho ...
随机推荐
- 安装Zookeeper和kafka,安装完毕后,遇到的错误
按照原文链接 http://www.cnblogs.com/swneng/p/10212460.html 在windows下进行安装 之后运行 D:\00H_Bigdata\kafka_2.11-2. ...
- Codeforces 525A - Vitaliy and Pie
525A - Vitaliy and Pie 思路:贪心+hashing. 代码: #include<bits/stdc++.h> using namespace std; string ...
- Python - WebDriver 识别登录验证码
Python - WebDriver 识别登录验证码 没什么可说的直接上代码! #-*-coding:utf-8-*- # Time:2017/9/29 7:16 # Author:YangYangJ ...
- Python - PIL-pytesseract-tesseract验证码识别
N天前实现了简单的验证识别,这玩意以前都觉得是高大上的东西,一直没有去研究,这次花了点时间研究了一下,当然只是一些基础的东西,高深的我也不会,分享一下给大家吧. 关于python验证码识别库,网上主要 ...
- python打印ms
ct打印的是时间戳,时间戳的小数点后前三位为ms eg:1555644362.055328 ms = 055 import time ct = time.time() local_time = ...
- 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 练习 ...
- 20170708xlVBA添加新产品修改公式
Sub ControlInsertProduct() Dim Wb As Workbook Dim OneSht As Worksheet Dim Arr As Variant Dim i As Lo ...
- php--------合并2个数字键数组的值
开发中遇到了,数组合并并去除重复这个功能,查阅资料, 找到了一个方法,分享一下. <?php /** * PHP合并2个数字键数组的值 * * @param array $arr1 * @par ...
- Android 7.0正式版工厂镜像下载
Android 7.0正式版工厂镜像下载 从3月份上线首个开发者预览版(Developer Preview)之后,经过近6个月时间的打磨,谷歌今天开始向Nexus设备推送Android 7.0 Nou ...
- Nginx+uWsgi生产部署Django
部署得过程很简单,部署得核心在于,为什么要这样做,每一个参数代表什么意思,最终的目的是得了解,一些基概念性的东西. uWsgi简介 说Uwsgi之前,先说一下Wsgi. 什么是Wsgi? WSGI: ...