资源简介

用OpenCV实现的交通标志动态识别,方法是自己想的,希望对大家有帮助,有好的想法可以互相交流。

资源截图

代码片段和文件信息

#ifdef _CH_
#pragma package 
#endif

#define CV_NO_BACKWARD_COMPATIBILITY

#include “cv.h“
#include “highgui.h“
#include “cxcore.h“
#include 
#include 
#include 

IplImage* stop=0;
IplImage* left=0;
IplImage* m1=0;
IplImage* m2=0;
IplImage* m3=0;
IplImage* m4=0;
IplImage* m5=0;
IplImage* m6=0;
IplImage* m7=0;
IplImage* m8=0;
IplImage* m9=0;
IplImage* m10=0;
IplImage* m11=0;
IplImage* m12=0;
IplImage* m13=0;
IplImage* m14=0;
IplImage* m15=0;
IplImage* image=0;
IplImage* show;
CvMemStorage* tempStorage=0;
CvMemStorage* stopStorage=0;
CvMemStorage* leftStorage=0;
CvMemStorage* m1Storage=0;
CvMemStorage* m2Storage=0;
CvMemStorage* m3Storage=0;
CvMemStorage* m4Storage=0;
CvMemStorage* m5Storage=0;
CvMemStorage* m6Storage=0;
CvMemStorage* m7Storage=0;
CvMemStorage* m8Storage=0;
CvMemStorage* m9Storage=0;
CvMemStorage* m10Storage=0;
CvMemStorage* m11Storage=0;
CvMemStorage* m12Storage=0;
CvMemStorage* m13Storage=0;
CvMemStorage* m14Storage=0;
CvMemStorage* m15Storage=0;
const char* wndname = “Flag“;
int itempFlag=0trigonFlag=0squareFlag=0;
CvSeq* result;
CvSeq* slice;
double s t hu;
CvSeqReader reader;

CvSeq* tctr;
CvSeq* p_temp;
CvSeq temp;
CvSeq* p_stopCtr;
CvSeq stopCtr;
CvSeq* p_leftCtr;
CvSeq leftCtr;
CvSeq* p_m1Ctr;
CvSeq m1Ctr;
CvSeq* p_m2Ctr;
CvSeq m2Ctr;
CvSeq* p_m3Ctr;
CvSeq m3Ctr;
CvSeq* p_m4Ctr;
CvSeq m4Ctr;
CvSeq* p_m5Ctr;
CvSeq m5Ctr;
CvSeq* p_m6Ctr;
CvSeq m6Ctr;
CvSeq* p_m7Ctr;
CvSeq m7Ctr;
CvSeq* p_m8Ctr;
CvSeq m8Ctr;
CvSeq* p_m9Ctr;
CvSeq m9Ctr;
CvSeq* p_m10Ctr;
CvSeq m10Ctr;
CvSeq* p_m11Ctr;
CvSeq m11Ctr;
CvSeq* p_m12Ctr;
CvSeq m12Ctr;
CvSeq* p_m13Ctr;
CvSeq m13Ctr;
CvSeq* p_m14Ctr;
CvSeq m14Ctr;
CvSeq* p_m15Ctr;
CvSeq m15Ctr;

// helper function:
// finds a cosine of angle between vectors
// from pt0->pt1 and from pt0->pt2
double angle( CvPoint* pt1 CvPoint* pt2 CvPoint* pt0 )
{
double dx1 = pt1->x - pt0->x;
double dy1 = pt1->y - pt0->y;
double dx2 = pt2->x - pt0->x;
double dy2 = pt2->y - pt0->y;
return (dx1*dx2 + dy1*dy2)/sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
}

void preorder(CvSeq* ctrCvSeq* saveCvMemStorage* storage)
{
if(ctr)
{
result = cvApproxPoly( ctr sizeof(CvContour) storage
CV_POLY_APPROX_DP cvContourPerimeter(ctr)*0.008 0 );
if( result->total ==3  && fabs(cvContourArea(resultCV_WHOLE_SEQ)) > 1000)
{
tctr=ctr;
ctr=ctr->v_next;
if(ctr)
{
slice=cvSeqSlice(ctrcvSlice(0CV_WHOLE_SEQ_END_INDEX)storage0);
*save=*slice;
trigonFlag=1;
}
else
ctr=tctr;
}
if( result->total ==4  && fabs(cvContourArea(resultCV_WHOLE_SEQ)) > 1000)
{
s = 1;
for( i = 0; i < (result->total+1); i++ )
{
// find minimum angle between joint
// edges (maximum of cosine)
if( i >= 2 )
{
t = fabs(angle(
(CvPoint*)cvGetSeqElem( result i )
(CvPoint*)cvGetSeqElem( result i-2 )
(CvPoint*)cvGetSeqElem( result i-1 )));
s = s < t ? s : t;
}
}
if(s<0.1)
{
tctr=ctr;

评论

共有 条评论