最近老鱼在学习交通标志识别的过程中接触了HSV颜色模型,看到了网上的HSV颜色分量表,但是在实际操作过程中出现了部分黄色交通标志可能由于老化或者光线的原因不能识别,因此写了下面一个小程序来测试颜色所对应的H值。
1.在文件夹中放入需要识别的图片,可以放多张图片进行调节(在这里我为了更好的观察放入了一张圆形色谱图)
2.确定该文件夹的路径
3.将该路径添加到代码中
4.查看结果
其中X与Y是图片像素点的坐标,图片越大程序运行时间越长
正黄色在26-34之间
蓝色在100-124
感兴趣的可以自己去尝试
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <iostream>
#include <fstream>
#include <string>
#include <dirent.h>
using namespace cv;
using namespace std;
int Hmin=0;
int Hmax=180;
DIR *dir;
struct dirent *entry;
string ImageName;
char *loadImageName;
Mat Image;
IplImage* image;
IplImage* hsv;
void H_track(int ,void *)
{
image=cvLoadImage(loadImageName,1);//导入图片
hsv = cvCreateImage( cvGetSize(image), 8, 3 ); //完成mat到iplimage的转换
cvCvtColor(image,hsv,CV_BGR2HSV);
for(int i = 0;i < hsv->height; i++) //遍历每一个像素点
{
for (int j = 0; j < hsv->width; j++)
{
cout<<"X = "<<i; //显示像素点的x坐标
cout<<" , Y = "<<j<<endl; //显示像素点的y坐标
CvScalar s_hsv = cvGet2D(hsv, i, j);//获取像素点为(i, j)点的HSV的值
CvScalar s;
if (!(((s_hsv.val[0]>Hmin)&&(s_hsv.val[0]<Hmax))))
{
s.val[0]=0; //改变像素点的H,S,V的值,使该像素点变成黑色
s.val[1]=0;
s.val[2]=0;
cvSet2D(hsv, i ,j, s);
}
}
}
cvShowImage("H调节", hsv);
IplImage *image1 = cvCreateImage(cvSize(hsv->width, hsv->height), 8, 1);
cvZero(image1);
cvCvtColor(hsv, image1, CV_BGR2GRAY);
cvShowImage("灰度图", image1);
//cvReleaseImage(&hsv); //因为需要一直观察试验结果所以不能回收
}
int main(int argc,char** argv)
{
if((dir=opendir("/home/yu/Desktop/ex/carphoto"))!=NULL) //该路径为你的文件夹路径
{
while((entry=readdir(dir))!=NULL)
{
cout<<entry->d_name<<endl; //显示文件的名称
ImageName=entry->d_name;
ImageName="/home/yu/Desktop/ex/carphoto/" + ImageName; //使ImageName形成绝对路径
loadImageName=(char*)ImageName.c_str();//对于string和char*进行转化
Image=imread(ImageName,1);
if(!Image.data) //判断图片是否可以打开
{
continue;
}
else
{
imshow("原图", Image);
cvNamedWindow("H调节");
cvNamedWindow("灰度图");
createTrackbar("Hmin","H调节",&Hmin, 180,H_track);
createTrackbar("Hmax","H调节",&Hmax, 180,H_track);
H_track(0,0);
waitKey(0); //按键切换下一张图片
}
}
}
else
{
printf("Error opening \n");
}
closedir(dir);
system("pause");
return 0;
}