前言
项目车号识别过程中,车体有三种颜色黑车黑底白字、红车红底白字、绿车黄底绿字,可以通过判断车体的颜色信息,从而判断二值化是否需要反转,主要是基于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(3); split(image, image_rgb); Mat B = (Mat_<double>)image_rgb.at(0) / 255; Mat G = (Mat_<double>)image_rgb.at(1) / 255; Mat R = (Mat_<double>)image_rgb.at(2) / 255; Mat_<double> H(image.rows, image.cols, 1); Mat_<double> S(image.rows, image.cols, 1); Mat_<double> V(image.rows, image.cols, 1); for (int m = 0; m <image.rows; m++) { for (int n = 0; 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) = 2 + (var_B - var_R) / del_Max; else if (var_B == var_Max) H.at<double>(m, n) = 4 + (var_R - var_G) / del_Max; H.at<double>(m, n) /= 6; if (H.at<double>(m, n) < 0) H.at<double>(m, n) += 1.0; } } } // end for hsv.at(0) = H; hsv.at(1) = S; hsv.at(2) = V; return hsv; }