OpenCV C++车型识别1-图像预处理

这个程序使用OpenCV C++实现简单的车型识别,这一小节进行图像预处理。

输入图片是没有小汽车的背景图片和有小汽车的前景图片:

上面两张图片做差,提取出只有小汽车的前景图片并二值化处理:

然后开运算(先腐蚀后膨胀),去除图像里的噪点和小物体:

现在只剩下几个小噪点了,去掉这几个小噪点并把整个车辆填充为一个整体,得到最终的结果:

第二小节是形状识别《OpenCV C++车型识别2-形状匹配-CSDN博客

代码:

cpp 复制代码
void Imgsub()
{
	BkGray=cvCreateImage(cvGetSize(BkImg),8,1);
	cvCvtColor(BkImg,BkGray,CV_BGR2GRAY);
	FrGray=cvCreateImage(cvGetSize(BkImg),8,1);
	cvCvtColor(FrImg,FrGray,CV_BGR2GRAY);

	cvSmooth(BkGray,BkGray,CV_GAUSSIAN,5);
	cvSmooth(FrGray,FrGray,CV_GAUSSIAN,5);

	SubImg=cvCreateImage(cvGetSize(BkImg),8,1);
	cvAbsDiff(FrGray,BkGray,SubImg);
}

void Binary()
{
	BinaryImg=cvCreateImage(cvGetSize(BkImg),8,1);
	cvThreshold(SubImg,BinaryImg,0,255,CV_THRESH_OTSU);	
}

void Open()
{
	IplConvKernel * kernel_5_5;
	kernel_5_5=cvCreateStructuringElementEx(5,5,2,2,CV_SHAPE_ELLIPSE,0);
	IplConvKernel * kernel_7_7;
	kernel_7_7=cvCreateStructuringElementEx(7,7,3,3,CV_SHAPE_ELLIPSE,0);

	cvErode(BinaryImg,BinaryImg,kernel_5_5,1);

	cvDilate(BinaryImg,BinaryImg,kernel_7_7,1);
}

void Removenoise()
{
	IplImage * BinaryImg2;
	BinaryImg2=cvCloneImage(BinaryImg);

	CvMemStorage * storage=cvCreateMemStorage(0);

	CvSeq * area_contour=NULL;
	int Number_contours=0;   
	double Area=0;           
	CvScalar s_fill_new;
	s_fill_new.val[0]=0;
	CvScalar loDiff;
	loDiff.val[0]=10;
	CvScalar upDiff;
	upDiff.val[0]=10;
	Number_contours=cvFindContours(BinaryImg,storage,&area_contour,sizeof(CvContour),CV_RETR_EXTERNAL);	
	for(CvSeq * c=area_contour;c!=NULL;c=c->h_next)
	{
		Area=fabs(cvContourPerimeter(c));
		if(Area<30)
		{
			for(int i=0;i<1;i++)
			{
				CvPoint * seedpoint=CV_GET_SEQ_ELEM(CvPoint,c,i);
		cvFloodFill(BinaryImg2,*seedpoint,s_fill_new,loDiff,upDiff,NULL,4,0);
			}
		}
	}
	BinaryImg=cvCloneImage(BinaryImg2);
}

void Imgfill()
{
	CvScalar s;
	CvScalar s_new;
	s_new.val[0]=255;
	int left_X=0;
    int right_X=0;
	int top_Y=0;
	int bottom_Y=0;

	for(int wt=0;wt<BinaryImg->width;wt++)
	{
		for(int ht=0;ht<BinaryImg->height;ht++)
		{	
			s=cvGet2D(BinaryImg,ht,wt);
			if(255==s.val[0])
			{
				top_Y=ht;
				for(int m=BinaryImg->height-1;m>=0;m--)
				{
					s=cvGet2D(BinaryImg,m,wt);
					if(255==s.val[0])
					{
						bottom_Y=m;
						break;
					}
				}
				for(int i=top_Y;i<=bottom_Y;i++)
					cvSet2D(BinaryImg,i,wt,s_new);
				ht=BinaryImg->height;
			}	
		}
	}

	for(int ht=0;ht<BinaryImg->height;ht++)
	{
		for(int wt=0;wt<BinaryImg->width;wt++)
		{	
			s=cvGet2D(BinaryImg,ht,wt);
			if(255==s.val[0])
			{
				for(int m=BinaryImg->width-1;m>=0;m--)
				{
					s=cvGet2D(BinaryImg,ht,m);
					if(255==s.val[0])
					{
						right_X=m;
						break;
					}
				}
				for(int i=left_X;i<=right_X;i++)
					cvSet2D(BinaryImg,ht,i,s_new);
				wt=BinaryImg->width;
			}
		}
	}
}
相关推荐
vibecoding7713 小时前
一文搞懂企业级 API 网关选型:12 个维度、4 类企业、7 步落地
人工智能·大模型·ai编程
Rocktech_ruixun13 小时前
机器人本地跑LLM大模型对主板硬件有什么要求?瑞迅科技RK3588/3568方案选型解析
人工智能·科技·嵌入式硬件·机器人·边缘计算
yxlalm13 小时前
Spring AI+RAG 01-项目背景与技术选型
java·人工智能·spring
tedcloud12313 小时前
Wand-Enhancer 怎么搭建?开源 Wand 客户端增强与远程控制工具介绍
大数据·服务器·人工智能·开源·音视频
科技苑13 小时前
如何用Python编程实现一个简单的Web爬虫?
人工智能·python
迅利科技13 小时前
新能源汽车零部件研发,SIMULIA一站式仿真解决方案如何缩短研发周期
人工智能·汽车
码匠许师傅14 小时前
【设计模式精讲】29.行为型模式总结与对比(Behavioral Patterns Summary)
c++·设计模式·uml
Databuff14 小时前
AI SSH工具,集齐SSH、SFTP、知识库RAG、AI助手
网络·人工智能·ssh
Blockchina14 小时前
从一篇文章到一条完整视频:用 Codex 搭建可复用的 AI 视频生产线
人工智能
啦啦啦啦啦zzzz14 小时前
Logger的组装(c++20)
c++·算法·c++20