汽车颜色识别--更新版
1、该程序是基于同事车牌定位接口上进行的;
2、为调试程序,程序中设定了鼠标选择图片易做图定区域来进行识别;
3、程序针对汽车颜色,一共8种颜色
PS:相比刚接触opencv就接手的半死不活的行人检测,这个算是稍稍给了些安慰O(∩_∩)O,继续努力撒
// color recognition.cpp : 定义控制台应用程序的入口点。
#include "stdafx.h"
#include <opencv2/opencv.hpp>
#include <iostream>
#include <stdio.h>
#include "cv.h"
#include <math.h>
using namespace cv;
using namespace std;
Rect r; //存储车牌位置
CvPoint origin;
IplImage* image=NULL;
int mark = 0; //选择ROI标志
#define N 12 //颜色模板的个数
// 颜色模板
// 黑、白、红、绿、蓝、黄/ 棕 、灰
#define BLACK 0
#define WHITE 1
#define RED1 2
#define RED2 3
#define GREEN1 4
#define GREEN2 5
#define BLUE1 6
#define BLUE2 7
#define YELLOW1 8
#define YELLOW2 9
#define BROWN 10
#define GRAY 11
int colorVelue[N][3] = {{50,50,50}, //黑
{255,255,255}, //白
{240,80,80}, //红小
{240,160,160}, //红大
{60,180,60}, //绿小
{160,240,160}, //绿大
{80,80,240}, //蓝小
{160,160,240}, //蓝大
{240,190,80}, //黄小
{240,240,160}, //黄大
{205,133,63}}; //棕/褐
//{162,162,162},//灰,特殊
void on_mouse( int event, int x, int y, int flags, void* zhang )
{
if( !image )
return;
CvPoint pt;
if( event == CV_EVENT_LBUTTONDOWN ) //开始点击选择跟踪物体
{
origin = cvPoint( x,y );
r = cvRect( x,y,0,0 );//坐标
r.x = MIN( x,origin.x );
r.y = MIN( y,origin.y );
r.width = r.x + CV_IABS( x - origin.x );
r.height = r.y + CV_IABS( y - origin.y );
r.x = MAX( r.x, 0 );
r.y = MAX( r.y, 0 );
r.width = MIN( r.width, image->width );
r.height = MIN( r.height, image->height );
r.width -= r.x;
r.height -= r.y;
}
if( event == CV_EVENT_LBUTTONUP )
{
pt = cvPoint( x,y );
mark = -1;
r.width = pt.x - r.x;
r.height = pt.y - r.y;
}
}
/*************************************************************************
* 函数名称:
* Color_difference()
* 参数:
* IplImage* car - 输入原图像
* Rect r - 源图像中划出的颜色识别区域
* 返回值:
* int* type - 指向颜色类型值,返回类型参数
* 说明:
* 该函数用来对图像进行颜色匹配识别。
************************************************************************/
//int Color_difference_HSV( cv::Mat car, Rect r,int* type)
//{
// //复制ROI区域图像
// cv::Mat roiImage = cvCreateImage(cvSize(r.width, r.height), 8, 3 );
// car(r).copyTo(roiImage);
// //
// /*cv::imshow("roi", roiImage);
// cv::waitKey(0); */
// //
// int hdims = 5; // 划分直方图bins的个数,越多越精确
// float hranges_arr[] = {0,180};//像素值的范围
// float* hranges = hranges_arr;//用于初始化CvHistogram类
//
// IplImage* roi = &roiImage.operator IplImage();
// IplImage* hsv = cvCreateImage(cvGetSize(roi), IPL_DEPTH_8U, 3);//用于存图像的一个中间变量,是用来分通道用的,分成hsv通道
// IplImage* tmpH1 = cvCreateImage( cvGetSize(roi), IPL_DEPTH_8U, 1);//通道的中间变量,用于肤色检测的中间变量
// IplImage* tmpS1 = cvCreateImage(cvGetSize(roi), IPL_DEPTH_8U, 1);
// IplImage* tmpH2 = cvCreateImage(cvGetSize(roi), IPL_DEPTH_8U, 1);
// IplImage* tmpS2 = cvCreateImage(cvGetSize(roi), IPL_DEPTH_8U, 1);
// IplImage* tmpH3 = cvCreateImage(cvGetSize(roi), IPL_DEPTH_8U, 1);
// IplImage* tmpS3 = cvCreateImage(cvGetSize(roi), IPL_DEPTH_8U, 1);
// IplImage* H = cvCreateImage( cvGetSize(roi), IPL_DEPTH_8U, 1);
// IplImage* S = cvCreateImage( cvGetSize(roi), IPL_DEPTH_8U, 1);
// IplImage* V = cvCreateImage( cvGetSize(roi), IPL_DEPTH_8U, 1);
// IplImage* src_tmp1=cvCreateImage(cvGetSize(roi),8,3);
//
//
// //CvHistogram *hist = cvCreateHist( 1, &hdims, CV_HIST_ARRAY, &hranges, 1 ); //分配建立直方图空间
// //IplImage* mask = cvCreateImage( cvGetSize(hsv), 8, 1 );//分配掩膜图像空间
// //IplImage* hue = cvCreateImage( cvGetSize(hsv), 8, 1 );
//
// // 高斯模糊
// //cvSmooth(roi,src_tmp1,CV_GAUSSIAN,3,3); //高斯模糊
//
// //// hue色度,saturation饱和度,value纯度
// //cvCvtColor(src_tmp1, hsv, CV_BGR2HSV );//颜色转换
// //cvCvtPixToPlane(hsv,H,S,V,0);//分为3个通道
//
// //cvInRangeS(H,cvScalar(0.0,0.0,0,0),cvScalar(20.0,0.0,0,0),tmpH1);
// //cvInRangeS(S,cvScalar(75.0,0.0,0,0),cvScalar(200.0,0.0,0,0),tmpS1);
// //cvAnd(tmpH1,tmpS1,tmpH1,0);
//
//// cvCalcHist( &hue, hist, 0, mask ); // 计算直方图
//
// if (1)
// {
// float velue[] = {0,0,0};
// float d = sqrt(pow(colorVelue[0][0]-velue[0],2)+pow(colorVelue[0][1]-velue[1],2)+pow(colorVelue[0][2]-velue[2],2));
//
// cout<<d<<endl;
// *type = RED1;
// }
// cvNamedWindow( "hsv", 1 );
// cvShowImage("hsv",roi);
// //cvWaitKey(0);
//
// cvReleaseImage(&hsv);
// cvDestroyWindow("hsv");
// cvReleaseImage(&tmpH1);
// cvReleaseImage(&tmpS1);
// cvReleaseImage(&tmpH2);
// cvReleaseImage(&tmpS2);
// cvReleaseImage(&tmpH3);
// cvReleaseImage(&tmpS3);
// cvReleaseImage(&H);
// cvReleaseImage(&S);
// cvReleaseImage(&V);
// cvReleaseImage(&src_tmp1);
// return *type;
//}
int Color_difference_RGB( cv::Mat car, Rect r )
{
int type = 0;
//复制ROI区域图像
if ( r.width==0 || r.height==0 )
{
return -1;
}
cv::Mat roiImage = cvCreateImage( cvSize(r.width, r.height), 8, 3 );
car(r).copyTo(roiImage);
IplImage* roi = &roiImage.operator IplImage();
IplImage*
补充:软件开发 , C++ ,