当前位置:编程学习 > C/C++ >>

汽车颜色识别--更新版

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++ ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,