基于ARM9的OpenCV火焰图像处理系统DOCWord格式.docx
- 文档编号:16734452
- 上传时间:2022-11-25
- 格式:DOCX
- 页数:17
- 大小:1.07MB
基于ARM9的OpenCV火焰图像处理系统DOCWord格式.docx
《基于ARM9的OpenCV火焰图像处理系统DOCWord格式.docx》由会员分享,可在线阅读,更多相关《基于ARM9的OpenCV火焰图像处理系统DOCWord格式.docx(17页珍藏版)》请在冰豆网上搜索。
5,在虚拟机上成功实现相关的功能后,就把OpenCV开源视觉库交叉编译成能在ARM上运行的OpenCV库,并移植到ARM中,从而使得ARM能够调用该库实现相关的功能。
6,然后将在虚拟机中编译的Qt应用程序,通过交叉编译,编译成ARM版本的应用程序,并复制到ARM中的根目录下的相应文件夹中,并且更改相应的配置使ARM能够在开机自动启动这个火焰图像处理程序。
4实验或仿真实验
实验器材:
硬件:
TQ2440开发板
软件:
VMwareWorkstation6
虚拟机操作系统:
Fedora10
集成开发环境:
Qtcreator1.3
OpenCV版本:
2.0.0
ARM中linux内核版本:
2.6.30.4
首先,程序在虚拟机中运行,在虚拟机中能够正常运行后,我们再将相应的程序交叉编译到ARM中。
以下这张图片是一张从监控室拍到的图像,目的只是为了能够达到辨认出火焰光圈的效果即可。
原始图像为:
在程序中,通过二值化处理后的图像为:
对灰度图像进行平滑处理:
对平滑后的灰度图像进行阈值化:
对阈值化之后的图像采取闭操作:
最后,以此画出闭操作之后的轮廓:
紧接着,后面四张图片为虚拟机得到的各个轮廓的面积,以及轮廓个数和轮廓面积的平均值。
注意:
这里轮廓面积的值指的是图片中的像素值。
由于在ARM开发板上实现对图像的显示要交叉移植GTK库,这个的工作量比较大,所以在该设计的过程中,我省去了这一步,简化为简单地导入图像,直接对图像分析,从而得到经过图像分析的轮廓个数,轮廓面积以及所有轮廓的平均面积。
下面给出实际实验效果图:
对比虚拟机上产生的数据,我们可以发现,在虚拟机上做图像处理得到的数据是:
共23个光圈轮廓,
光圈号
虚拟机
ARM
1
93
2
54
3
66
4
42
5
60
6
48
7
8
9
10
84953
11
50320.5
12
1241.5
13
14
15
16
17
28
18
8.5
19
20
21
22
23
49
平均面积
169.979
169.98
从实验数据中,我们可以看到,虚拟机和ARM中实验出来的数据中,同样是23个光圈,每个轮廓计算出来的光圈像素面积也是相同的,唯独不一样的是23个光圈的像素面积的平均值是不同的,在虚拟机中是169.979,而在ARM中的是169.98,仅仅是一个小数位的近似为题,这很好地验证了ARM中的OpenCV的移植以及图像分析功能是成功的。
以此,我们就可以通过燃烧学的相关理论,通过对光圈个数,以及光圈多少,和光圈大小来判断锅炉燃烧的情况,从而安全有效地监控火力发电锅炉的正常运作。
5总结
本设计主要的特点在于利用了视觉的方法来对火焰进行检测,通过视觉方法可以得到火焰燃烧情况的全方位信息,改良了一般火焰检测系统利用火焰传感器或烟雾传感器等会产生误判缺点。
也从中发现,将OpenCV移植进ARM中,并在ARM中对图像处理是可行的,而且分析能力除处理速度方面可能比PC机慢一些而已外,从本设计中看,ARM对图像的处理只在准确度上面与PC机略有不同。
本系统虽然能完成目前的简单图像分析,但如果要求连续快速地分析图像,ARM的图像处理实时性可能满足不了。
因为考虑到这个速度不够快的问题,后面若要进一步深入的开发此系统,将考虑换成ARM11或更高级的处理器来实现此设计。
经过本次设计,我对ARM和文件系统都有了进一步了解,尤其对Linux操作系统的使用,有了进一步提高,而且对这种在ARM和PC之间进行交叉编译、移植等操作有了进一步的认识,也学会了这种交叉开发的技能,对自己的动手实践能力有了很大的提高。
也通过这一次设计,发现自己还在嵌入式开发方面还欠缺许多必要的技能,比如驱动开发的能力,为此,我将在日后进一步加强对嵌入式开发的学习。
最后,我得感谢吴老师给我们提供这样一个提高和培养动手实践能力的机会,令我们在得到锻炼的同时,还开阔了眼界s。
附录
以下附上主要程序代码:
#include"
widget.h"
ui_widget.h"
cv.h"
highgui.h"
Widget:
:
Widget(QWidget*parent):
QWidget(parent),
ui(newUi:
Widget)
{
ui->
setupUi(this);
}
~Widget()
deleteui;
voidWidget:
changeEvent(QEvent*e)
QWidget:
changeEvent(e);
switch(e->
type()){
caseQEvent:
LanguageChange:
retranslateUi(this);
break;
default:
}
on_pushButton_clicked()
/*==usethecamtoreadtheimage,replacethergb_Imagewithframe
CvCapture*capture;
capture=cvCreateCameraCapture(0);
IplImage*frame;
while
(1)
{
frame=cvQueryFrame(capture);
charc=cvWaitkey(33);
==================================================================*/
//readfromimage
//myProcess.start("
/cam2jpg_2.6.30.4"
);
IplImage*rgb_Image=cvLoadImage("
fire10.jpg"
CV_LOAD_IMAGE_COLOR);
IplImage*gray_Image;
IplImage*gray_Smooth_Image;
IplImage*threshold_Image;
IplImage*morphologyEx_Image;
IplImage*copy_MorphologyEx_Image;
IplImage*result;
IplImage*rgb_Temp;
IplImage*morphologyEx_Temp;
CvScalarvalue;
CvScalaravg;
CvMemStorage*g_storage=cvCreateMemStorage(0);
CvSeq*contours=0;
IplImage*contours_Image;
CvSizesz=cvGetSize(rgb_Image);
gray_Image=cvCreateImage(sz,IPL_DEPTH_8U,1);
//turnintogray
gray_Smooth_Image=cvCreateImage(sz,IPL_DEPTH_8U,1);
//smoothimage
threshold_Image=cvCreateImage(sz,IPL_DEPTH_8U,1);
morphologyEx_Image=cvCreateImage(sz,IPL_DEPTH_8U,1);
result=cvCreateImage(sz,IPL_DEPTH_8U,1);
//matrixofresult
rgb_Temp=cvCreateImage(sz,IPL_DEPTH_8U,1);
//all1matrix,protectfrom0
morphologyEx_Temp=cvCreateImage(sz,IPL_DEPTH_8U,1);
copy_MorphologyEx_Image=cvCreateImage(sz,IPL_DEPTH_8U,1);
contours_Image=cvCreateImage(sz,IPL_DEPTH_8U,1);
//all1matrixinitialize
value.val[0]=0x1;
for(inti=0;
i<
rgb_Temp->
height;
i++)
for(intj=0;
j<
width;
j++)
cvSet2D(rgb_Temp,i,j,value);
cvCvtColor(rgb_Image,gray_Image,CV_BGR2GRAY);
cvSmooth(gray_Image,gray_Smooth_Image,CV_GAUSSIAN,5,5,0,0);
//defaultmethodisGAUSSIAN
avg=cvAvg(gray_Smooth_Image);
if(avg.val[0]>
150)
cvThreshold(gray_Image,threshold_Image,avg.val[0],255,CV_THRESH_BINARY);
else
cvThreshold(gray_Image,threshold_Image,150,255,CV_THRESH_BINARY);
cvMorphologyEx(threshold_Image,morphologyEx_Image,morphologyEx_Temp,NULL,CV_MOP_OPEN,2);
cvCopy(morphologyEx_Image,copy_MorphologyEx_Image);
cvFindContours(copy_MorphologyEx_Image,g_storage,&
contours);
cvDrawContours(contours_Image,contours,cvScalarAll(255),cvScalarAll(150),100,2);
//graylevel:
while=255black=0
CvContourScannercontour_Scanner=cvStartFindContours(copy_MorphologyEx_Image,g_storage,sizeof(CvContour),CV_RETR_LIST,CV_CHAIN_APPROX_SIMPLE,cvPoint(0,0));
inti=0;
CvSeq*present_Contour=cvFindNextContour(contour_Scanner);
while(present_Contour)
i++;
textEdit->
append(tr("
%1areaofcontour:
%2"
).arg(i).arg(fabs(cvContourArea(present_Contour,CV_WHOLE_SEQ))));
//cout<
<
"
areaofcontour:
"
fabs(cvContourArea(present_Contour,CV_WHOLE_SEQ))<
endl;
present_Contour=cvFindNextContour(contour_Scanner);
numberofcontour="
averagevalue="
avg.val[0]<
numberofcontour=%1"
).arg(i));
averagevalue=%1"
).arg(avg.val[0]));
cvNamedWindow("
rgb_Image"
CV_WINDOW_AUTOSIZE);
gray_Image"
gray_Smooth_Image"
threshold_Image"
morphologyEx_Image"
contours_Image"
//cvNamedWindow("
result_Image"
cvShowImage("
rgb_Image);
gray_Image);
gray_Smooth_Image);
threshold_Image);
morphologyEx_Image);
contours_Image);
//cvShowImage("
result);
cvWaitKey();
cvReleaseImage(&
rgb_Image);
gray_Image);
gray_Smooth_Image);
threshold_Image);
result);
rgb_Temp);
morphologyEx_Temp);
morphologyEx_Image);
contours_Image);
cvDestroyWindow("
//cvDestroyWindow("
参考文献
[1]霍亚飞.QtCreator快速入门[M].2版。
北京:
北京航空航天大学出版社,2014年1月
[2]GaryBradski,AdrianKaebler.学习OpenCV[M].北京:
清华大学出版社,2012年9月
[3]杜春雷.ARM体系结构与编程[M].北京:
清华大学出版社,2003年2月
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 ARM9 OpenCV 火焰 图像 处理 系统 DOC