智能小车汇报Word下载.docx
- 文档编号:7941236
- 上传时间:2023-05-09
- 格式:DOCX
- 页数:17
- 大小:637.09KB
智能小车汇报Word下载.docx
《智能小车汇报Word下载.docx》由会员分享,可在线阅读,更多相关《智能小车汇报Word下载.docx(17页珍藏版)》请在冰点文库上搜索。
OPENCV1.0级联分类器。
设计思路:
opencv通过USB摄像头采集图像,通过级联分类器识别目标,通过目标在图像中的大小和位置,通过GPIO输出高低电平控制小车的前进,转向。
图1.1系统结构框图
第三章智能车机械部分安装和调试
3.1前轮部分
通过两个电机控制小车,前进的时候两个电机都向前转,后退的时候两个电机向后转。
左转时候左边电机不转,右边电机转动,又转时右边电机不转,左边电机旋转。
3.2底盘部分
采用三轮底盘,方便小车灵活转向。
第四章智能车的电路设计与实现
4.1电源部分
直流电机使用三节五号电池供电,在车的底盘下方,ARM板单独的供电。
4.2电机驱动
图4.4l9110h驱动电路原理图
图4.5电路实物图
每个电机通过一对高低电平控制。
第五章智能车的控制策略和算法
5.1目标识别算法
Opencvhaar特征级联分类器,将目标的样本图像载入并进行训练,训练出基于haar的级联分类器,可以识别特定的目标(小球)。
然后判断识别目标在整幅图像中的大小,识别目标的大小在整幅图像中的比例较小的话,可以判断数目标在车的前方而且距离比较远。
识别的目标用圆形进行标注,以图像的横向中间为界限,如果圆心在界限的左边,则小球在车的左边,反之在车的右边,中间可以给适当的缓冲区。
5.2电机的控制
直流电机是通过电机驱动芯片控制的,电机驱动芯片连接到ARM的GPIO接口,通过给GPIO接口输出高低电平来控制电机。
由于AMR上使用的是LINUX操作系统,程序想要控制电机,先要加载GPIO驱动,通过驱动程序控制GPIO输出的电平。
本程序使用GPIO的M0-M3接口,M0,M1控制左边的电机,M2,M3控制右边的电机。
第六章智能车控制软件的编写
6.1初始化程序
初始化程序主要包括:
载入OPENCV级联分类器特征数据,加载USB摄像头驱动打开USB摄像头,加载GPIO驱动,打开GPIOM0-M3。
6.2控制主程序
启动linux的定时器,定时器每隔1毫秒执行一次。
定时器的执行函数包括opencv摄像头数据采集和haar特征分类器的目标识别,这两个过程是串行的,将摄像头采集的每一帧数据载入级联分类器,如果识别出了小球,就通过识别目标图像的大小和圆心的位置判断小球的位置,如果小球是在正前方,则通过驱动程序给GPIO输出前进的信号,如果在左边,右边,则给出左转右转的信号。
第七章运行调试部分
7.1arm-linux-gcc交叉编译开发环境
交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。
我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。
比如,我们在Windows平台上,可使用VisualC++开发环境,编写程序并编译成可执行程序。
这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为nativecompilation,中文可理解为本机编译。
然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的ARM平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。
这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilationtoolchain)需要很大的存储空间,并需要很强的CPU运算能力。
为了解决这个问题,交叉编译工具就应运而生了。
通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序
附件程序
#include"
main_form.h"
#include<
qcheckbox.h>
unistd.h>
stdlib.h>
sys/types.h>
sys/stat.h>
sys/ioctl.h>
fcntl.h>
qimage.h>
qpixmap.h>
stdio.h>
cv.h>
cxcore.h>
highgui.h>
string.h>
assert.h>
math.h>
float.h>
limits.h>
time.h>
ctype.h>
termios.h>
#ifdef_EiC
#defineWIN32
#endif
staticCvMemStorage*storage=0;
staticCvHaarClassifierCascade*cascade=0;
IplImage*detect_and_draw(IplImage*image);
constchar*cascade_name="
/home/plg/data.xml"
;
IplImage*pFrame=NULL;
CvCapture*pCapture;
inttimes=0;
intleftwheel;
intrightwheel;
intfd;
inttimedeny=0;
voidinitdevice()
{
pCapture=cvCreateCameraCapture
(2);
//pCapture=cvCaptureFromAVI("
/home/plg/1.avi"
);
cascade=(CvHaarClassifierCascade*)cvLoad(cascade_name,0,0,0);
if(!
cascade)
{
fprintf(stderr,"
ERROR:
Couldnotloadclassifiercascade\n"
);
fprintf(stderr,
"
Usage:
facedetect--cascade=\"
<
cascade_path>
\"
[filename|camera_index]\n"
}
storage=cvCreateMemStorage(0);
}
QImagemybegin()
charpaths[10][30]={"
/home/plg/imgs/1.jpg"
"
/home/plg/imgs/2.jpg"
/home/plg/imgs/3.jpg"
/home/plg/imgs/4.jpg"
/home/plg/imgs/5.jpg"
/home/plg/imgs/6.jpg"
/home/plg/imgs/7.jpg"
/home/plg/imgs/8.jpg"
/home/plg/imgs/9.jpg"
/home/plg/imgs/10.jpg"
};
pFrame=cvQueryFrame(pCapture);
if(pFrame)
//if(detect_and_draw(pFrame)==1)
//{
//}
//cvSaveImage("
/home/plg/pang.jpg"
pFrame);
//QImageimage((uchar*)pFrame->
imageData,pFrame->
width,pFrame->
height,8,0,1,QImage:
:
IgnoreEndian);
if(times<
10)
//cvSaveImage(paths[times],pFrame);
if(times<
cvSaveImage(paths[times],pFrame);
times++;
IplImage*pFrame2=detect_and_draw(pFrame);
intx,y;
inti=0;
QImageimg;
QRgb*point;
intr,g,b;
if(img.create(pFrame->
width,pFrame->
height,32,0,QImage:
IgnoreEndian))
for(x=0;
x<
pFrame->
height;
x++)
for(y=0;
y<
width;
y++)
r=(int)(uchar*)pFrame2->
imageData[i+2];
g=(int)(uchar*)pFrame2->
imageData[i+1];
b=(int)(uchar*)pFrame2->
imageData;
point=(QRgb*)img.scanLine(x)+y;
*point=qRgb(r,g,b);
i+=3;
returnimg;
returnNULL;
IplImage*detect_and_draw(IplImage*img)
intbm=0;
staticCvScalarcolors[]=
{{0,0,255}},
{{0,128,255}},
{{0,255,255}},
{{0,255,0}},
{{255,128,0}},
{{255,255,0}},
{{255,0,0}},
{{255,0,255}}
};
detect_and_draw\n"
doublescale=1.3;
IplImage*gray=cvCreateImage(cvSize(img->
width,img->
height),8,1);
IplImage*small_img=cvCreateImage(cvSize(cvRound(img->
width/scale),
cvRound(img->
height/scale)),
8,1);
inti;
cvCvtColor(img,gray,CV_BGR2GRAY);
cvResize(gray,small_img,CV_INTER_LINEAR);
cvEqualizeHist(small_img,small_img);
cvClearMemStorage(storage);
if(cascade)
doublet=(double)cvGetTickCount();
CvSeq*faces=cvHaarDetectObjects(small_img,cascade,storage,
1.1,2,0/*CV_HAAR_DO_CANNY_PRUNING*/,
cvSize(10,10));
if(faces->
total>
0)
t=(double)cvGetTickCount()-t;
for(i=0;
i<
(faces?
faces->
total:
0);
i++)
CvRect*r=(CvRect*)cvGetSeqElem(faces,i);
CvPointcenter;
intradius;
center.x=cvRound((r->
x+r->
width*0.5)*scale);
center.y=cvRound((r->
y+r->
height*0.5)*scale);
radius=cvRound((r->
width+r->
height)*0.25*scale);
cvCircle(img,center,radius,colors[i%8],3,8,0);
printf("
center%d:
radius%d\n"
center.x,radius);
if(center.x>
170)
ioctl(fd,7);
timedeny=0;
while(timedeny<
10000000)
timedeny++;
ioctl(fd,0);
}
elseif(center.x<
150)
ioctl(fd,1);
}else
if(radius>
=110)
ioctl(fd,4);
else
{
ioctl(fd,3);
//go();
gettarget\n"
//cvSaveImage("
img);
//cvShowImage("
result"
img);
bm=1;
else
///////停止峰鸣器
//stop_buzzer();
printf("
keepdedect\n"
ioctl(fd,0,0);
bm=0;
cvReleaseImage(&
gray);
small_img);
returnimg;
QImage&
cvxCopyIplImage(constIplImage*pIplImage);
voidTMainForm:
timerEvent(QTimerEvent*)
QImageimg=mybegin();
//img.load("
QPixmapmp;
mp.convertFromImage(img);
m_led4->
setPixmap(mp);
TMainForm:
TMainForm(QWidget*parent,constchar*name,WFlagsf)
:
TMainFormBase(parent,name,f)
system("
kill-sSTOP`pidofled-player`"
m_fd=:
open("
/dev/leds0"
O_RDONLY);
if(m_fd<
0)
/dev/leds"
fd=open("
/dev/ledtest"
0);
if(fd<
0){
fd=open("
perror("
opendeviceleds"
system("
modprobehello"
keepdetect\n"
connect(m_led1,SIGNAL(clicked()),this,SLOT(checkBoxClicked()));
connect(m_led2,SIGNAL(clicked()),this,SLOT(checkBoxClicked()));
connect(m_led3,SIGNAL(clicked()),this,SLOT(checkBoxClicked()));
connect(m_led4,SIGNAL(clicked()),this,SLOT(checkBoxClicked()));
checkBoxClicked();
IplImage*frame;
frame=cvLoadImage("
initdevice();
startTimer
(1);
~TMainForm()
close(m_fd);
close(fd);
ioctl(fd,0,0);
checkBoxClicked()
ioctl(m_fd,int(m_led1->
isChecked()),0);
ioctl(m_fd,int(m_led2->
isChecked()),1);
ioctl(m_fd,int(m_led3->
isChecked()),2);
ioctl(m_fd,int(m_led4->
isChecked()),3);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 小车 汇报