云计算百科
云计算领域专业知识百科平台

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

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

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

   

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

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

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

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

代码:

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;
}
}
}
}

赞(0)
未经允许不得转载:网硕互联帮助中心 » OpenCV C++车型识别1-图像预处理
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!