版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
10嵌视科技的嵌入式视觉应用开发平台的用户开发高效的视本手册归嵌视科技所有。嵌视科技,任何单于嵌视科技提供的产品之外的商业目的,违者将其。 第一章绪 为什么选用ARM平台 约 第二章高效图像处理的几个基本原 第三章YUV转RGB的高效实 算法简 练习 第四章Sobel梯度幅度图像的高效实 算法简 练习 第五章Sobel梯度方向图像的高效实 算法简 练习 第六章结束 第一章绪论Mathlab等工具和OpenCV等库函数加快了研究者出的效率,并加除可购置的功能外,针对特定应用设计针对性的解决方案,并自的形式带你进入这条路线。当然我们只是领进门,还得靠自身。选用基于ARM的嵌入式图像处理平台,以节省硬件及移植成本。原因在1.3节中介绍。ARM600M计的多核DSP、开发相应的并行处理机制、并针对平台设计及优化算法。因此,基于DSP平台开发的视觉应用模块的成本很高。不需要进行二次优化PCLinuxQtarmPC的图像及目标信息以可视化界面的形式显示到LCD屏幕上,且可以通为640×480。第二章高效图像处理的几个基本原高效应用模块的开发需要的是长时间的经验积累,在这里我们仅减少了300万次运算,那效率方面就会提高很多。for:调用一次函数就涉及到函数寻址、尽量采用定点整形运算,尽量避免大量的多层级的if…else…:使得开发的算法能够支持的嵌入式图像处理开发平台。第三章YUVRGB用RGB格式,本章将针对此需求你如何实现YUV到RGB的高效转化。YYY YB//YUV转RGB//downloadfromvoidYuv2Rgbconstunsignedchar*img_8u2_yuyv, unsignedchar*img_8u3_rgb, /*输出图像RGB*/constint//YUV转RGB//downloadfromvoidYuv2Rgbconstunsignedchar*img_8u2_yuyv, unsignedchar*img_8u3_rgb, /*输出图像RGB*/constint /*图像宽度constint /*图像高度{intin,out=0;unsignedintpixel_16;unsignedcharpixel_24[3];unsignedintpixel32;inty0,u,y1,for(in=0;in<img_width*img_height*2;in+={pixel_16img_8u2_yuyv[in+3]<<24img_8u2_yuyv[in+2]<<16img_8u2_yuyv[in+1]<<8img_8u2_yuyv[in+y0=(pixel_16&u=(pixel_16&0x0000ff00)>>8;y1=(pixel_16&0x00ff0000)>>16;v=(pixel_16&0xff000000)>>24;pixel32=convert_yuv_to_rgb_pixel(y0,u,v);pixel_24[0]=(pixel32&0x000000ff);pixel_24[1]=(pixel32&0x0000ff00)>>8;pixel_24[2]=(pixel32&0x00ff0000)>>16;img_8u3_rgb[out++]=pixel_24[0];img_8u3_rgb[out++]=pixel_24[1];img_8u3_rgb[out++]=pixel_24[2];pixel32=convert_yuv_to_rgb_pixel(y1,u,v);pixel_24[0]=(pixel32&0x000000ff);pixel_24[1]=(pixel32&0x0000ff00)>>8;pixel_24[2]=(pixel32&0x00ff0000)>>16;img_8u3_rgb[out++]=pixel_24[0];img_8u3_rgb[out++]=pixel_24[1];img_8u3_rgb[out++]=pixel_24[2];}}intconvert_yuv_to_rgb_pixel(inty,intu,int{unsignedintpixel32=unsignedchar*pixel=(unsignedchar*)&pixel32;intr,g,b;r=y+(1.370705*(v-g=y-(0.698001*(v-128))-(0.337633*(u-128));b=y+(1.732446*(u-128));if(r>255)r=if(g>255)g=if(b>255)b=if(r<0)rif(r<0)r=if(g<0)g=if(b<0)b=0;pixel[0]=r*220/256;pixel[1]=g*220/256;pixel[2]=b*220/256;returnpixel32;}取得YUYV,4优化版本02——单帧算法耗时2:不要在大的for//YUV转RGB//Author:voidYuv2Rgb化后的代码如下所示。利用此代码完成图像程序(光盘中提供,源代码\优\ca//YUV转RGB//Author:voidYuv2Rgbconstunsignedchar*img_8u2_yuyv, unsignedchar*img_8u3_rgb, constint /*图像宽度constint /*图像高度{intin,out=0;unsignedintpixel_16;unsignedcharpixel_24[3];unsignedintpixel32;inty0,u,y1,unsignedchar*pixel=(unsignedchar*)&pixel32;intr,g,b;for(in=0;in<img_width*img_height*2;in+={pixel_16=img_8u2_yuyv[in+3]<<24img_8u2_yuyv[in+2]<<16img_8u2_yuyv[in+1]<<8img_8u2_yuyv[in+y0=(pixel_16&u=(pixel_16&0x0000ff00)>>8;y1=(pixel_16&0x00ff0000)>>16;v=(pixel_16&0xff000000)>>24;r=y0+(1.370705*(v-g=y0-(0.698001*(v-128))-(0.337633*(u-128));b=y0+(1.732446*(u-128));if(r>255)r=if(g>255)g=if(b>255)b=if(r<0)r=if(g<0)g=if(b<0)b=0;pixel[0]=r;pixel[1]=g;pixel[2]=b;pixel_24[0]=(pixel32&0x000000ff);pixel_24[1]=(pixel32&0x0000ff00)>>8;pixel_24[2]=(pixel32&0x00ff0000)>>img_8u3_rgb[out++]img_8u3_rgb[out++]=pixel_24[0];img_8u3_rgb[out++]=pixel_24[1];img_8u3_rgb[out++]=pixel_24[2];r=y1+(1.370705*(v-g=y1-(0.698001*(v-128))-(0.337633*(u-b=y1+(1.732446*(u-if(r>255)r=if(g>255)g=if(b>255)b=if(r<0)r=if(g<0)g=if(b<0)b=0;pixel[0]=r;pixel[1]=g;pixel[2]=b;pixel_24[0]=(pixel32&0x000000ff);pixel_24[1]=(pixel32&0x0000ff00)>>8;pixel_24[2]=(pixel32&0x00ff0000)>>16;img_8u3_rgb[out++]=pixel_24[0];img_8u3_rgb[out++]=pixel_24[1];img_8u3_rgb[out++]=pixel_24[2];}},YUV了50ms,效果非常明显,因此要尽量避免大规模的除法运算和函数调用,这个优化版本03——单帧算法耗时pixel_16pixel_16img_8u2_yuyv[in+3]<<24|img_8u2_yuyv[in+2]<<16|img_8u2_yuyv[in+1]<<8img_8u2_yuyv[in+//YUV转RGB//Author:voidYuv2Rgby0y0=(pixel_16&u=(pixel_16&0x0000ff00)>>8;y1=(pixel_16&0x00ff0000)>>16;v=(pixel_16&0xff000000)>>24;y0y0=img_8u2_yuyvu=img_8u2_yuyv[in+y1=img_8u2_yuyv[in+2];v=img_8u2_yuyv[in+pixel[0]pixel[0]=r;pixel[1]=g;pixel[2]=pixel_24[0]=(pixel32&0x000000ff);pixel_24[1]=(pixel32&0x0000ff00)>>8;pixel_24[2]=(pixel32&0x00ff0000)>>16;img_8u3_rgb[out++]=pixel_24[0];img_8u3_rgb[out++]=pixel_24[1];img_8u3_rgb[out++]=img_8u3_rgbimg_8u3_rgb[out++]=r;img_8u3_rgb[out++]=img_8u3_rgb[out++]=intyuv_size=intyuv_size=img_width*img_height*2;for(in=0;in<yuv_size;in+=4)for(in=0;in<img_width*img_height*2;in+=同时,我们修改了inout代码如下所示。利用此代码完成图像程序(光盘中提供,源代码\优化示例中运行,结果显示该函数的运行时间达到129ms。constunsignedchar*img_8u2_yuyv, unsignedchar*img_8u3_rgb, constint /*图像宽度constint /*图像高度{intyuv_size=img_width*img_height*intoffset_rgb=0;intoffset_yuv=//YUYVinty0,u,y1,intr,g,b;for(offset_yuv=0;offset_yuv<yuv_size;offset_yuv+={y0=u=img_8u2_yuyv[offset_yuv+1];y1=img_8u2_yuyv[offset_yuv+2];v=img_8u2_yuyv[offset_yuv+3];r=y0+(1.370705*(v-g=y0-(0.698001*(v-128))-(0.337633*(u-128));b=y0+(1.732446*(u-128));if(r>255)r=if(g>255)g=if(b>255)b=if(r<0)r=if(g<0)g=if(b<0)b=0;img_8u3_rgb[offset_rgb++]=r;img_8u3_rgb[offset_rgb++]=g;img_8u3_rgb[offset_rgb++]=r=y1+(1.370705*(v-gg=y1-(0.698001*(v-128))-(0.337633*(u-b=y1+(1.732446*(u-if(r>255)r=if(g>255)g=if(b>255)b=if(r<0)r=if(g<0)g=if(b<0)b=0;img_8u3_rgb[offset_rgb++]=r;img_8u3_rgb[offset_rgb++]=g;img_8u3_rgb[offset_rgb++]=}}7ms,可简化。另外,u-128和v-128均进行了多次计算,可简化。码完成图像采集程序(光盘中提供,源代码\优化示例程序源代码//YUV转RGB//Author:\camera04.rar//YUV转RGB//Author:voidYuv2Rgbconstunsignedchar*img_8u2_yuyv, unsignedchar*img_8u3_rgb, constint /*图像宽度constint /*图像高度{intyuv_size=img_width*img_height*intoffset_rgb=0;intoffset_yuv=//YUYVinty0,u,y1,intdelta_r,delta_g,//RGBintr,g,for(offset_yuv=0;offset_yuv<yuv_size;offset_yuv+={y0=u=img_8u2_yuyv[offset_yuv+1]-128; y1=img_8u2_yuyv[offset_yuv+2];vimg_8u2_yuyv[offset_yuv3] delta_r=(int)(1.370705*delta_g=-(int)(0.698001*v+0.337633*u);delta_b=(int)(1.732446*u);ry0delta_r;gy0delta_g;b=y0if(r>255)r=if(g>255)g=if(b>255)b=if(r<0)r=if(g<0)g=if(b<0)b=0;img_8u3_rgb[offset_rgb++]if(b<0)b=0;img_8u3_rgb[offset_rgb++]=r;img_8u3_rgb[offset_rgb++]=g;img_8u3_rgb[offset_rgb++]=ry1delta_r;gy1delta_g;by1if(r>255)r=if(g>255)g=if(b>255)b=if(r<0)r=if(g<0)g=if(b<0)b=0;img_8u3_rgb[offset_rgb++]=r;img_8u3_rgb[offset_rgb++]=g;img_8u3_rgb[offset_rgb++]=}}码完成图像采集程序(光盘中提供,源代码\优化示例程序源代码//YUV转RGB//Author:voidYuv2Rgb\camera05.ra//YUV转RGB//Author:voidYuv2Rgbconstunsignedchar*img_8u2_yuyv, unsignedchar*img_8u3_rgb, constint /*图像宽度constint /*图像高度{intyuv_size=img_width*img_height*intoffset_rgb=0;intoffset_yuv=//YUYVinty0,u,y1,intdelta_r,delta_g,//RGBintr,g,for(offset_yuv=0;offset_yuv<yuv_size;offset_yuv+={y0=u=img_8u2_yuyv[offset_yuv+1]-128; y1=img_8u2_yuyv[offset_yuv+2];vimg_8u2_yuyv[offset_yuv3] delta_r351*v)>>8;delta_g=-((179*v+86*u)>>8);delta_b=(444*u)>>8;ry0delta_r;gy0delta_g;b=y0if(r>255)r=if(g>255)g=if(b>255)b=if(r<0)r=if(g<0)g=if(b<0)b=img_8u3_rgb[offset_rgb++]img_8u3_rgb[offset_rgb++]=r;img_8u3_rgb[offset_rgb++]=g;img_8u3_rgb[offset_rgb++]=b;ry1delta_r;gy1delta_g;by1delta_b;if(r>255)r=if(g>255)g=if(b>255)b=if(r<0)r=if(g<0)g=if(b<0)b=0;img_8u3_rgb[offset_rgb++]=r;img_8u3_rgb[offset_rgb++]=g;img_8u3_rgb[offset_rgb++]=}}最终版本——单帧算法耗时优化原则:尽量避免大量的if…else//YUV转RGB//Author:voidYuv2Rgbconstunsignedchar*img_8u2_yuyv, unsignedchar*img_8u3_rgb, constint /*图像宽度constint//YUV转RGB//Author:voidYuv2Rgbconstunsignedchar*img_8u2_yuyv, unsignedchar*img_8u3_rgb, constint /*图像宽度constint /*图像高度{intintyuv_size=img_width*img_height*intoffset_rgb=0;intoffset_yuv=//YUYVinty0,u,y1,intdelta_r,delta_g,unsignedchartable_cut[1024];for(i=0;i<512;i++)table_cut[i]=for(i=512;i<768;i++)table_cut[i]=i-512;for(i=768;i<1024;table_cut[i]=for(offset_yuv=0;offset_yuv<yuv_size;offset_yuv+={y0=img_8u2_yuyv[offset_yuv]+512; u=img_8u2_yuyv[offset_yuv+1]-128; y1=img_8u2_yuyv[offset_yuv+2]+512; v=img_8u2_yuyv[offset_yuv+3]-128; delta_r351*v)>>8;delta_g=-((179*v+86*u)>>8);delta_b=(444*u)>>8;img_8u3_rgb[offset_rgb++]=table_cut[y0+delta_r];img_8u3_rgb[offset_rgb++]=table_cut[y0+delta_g];img_8u3_rgb[offset_rgb++]=table_cut[y0+delta_b];img_8u3_rgb[offset_rgb++]=table_cut[y1+delta_r];img_8u3_rgb[offset_rgb++]=table_cut[y1+delta_g];img_8u3_rgb[offset_rgb++]=table_cut[y1+delta_b];}}}尽管版本6和版本5的效率在ARM上无明显区别,但我们还是推荐采用版本6的方法,以使得开发的算法具有不同平台的适应能力。第四章bl1 Gx 2 , Gx 1 I[i1,j1]2I[i1,j]I[i1,j I[i1,j1]2I[i1,j]I[i I[i1,j1]2I[i,j1]I[i1,j I[i1,j1]2I[i,j1]I[i MMMM M
初始版本01——单帧算法耗时把生成的可执行程序到开发板中运行,结果显示该函数的运行时间达到//Author://Author:voidconstunsignedchar*img_8u1_src, unsignedchar*img_8u1_mag, constint /*图像宽度constint /*图像高度{inti,j,intlast_width=img_width-intlast_height=img_height-1;intMx,My,M;offset=last_height*img_width; for(i=0;i<img_width;i++){img_8u1_mag[i]=img_8u1_mag[offset+i]=}for(j=0;j<img_height;{offset=j*img_width; img_8u1_mag[offset]=0;img_8u1_mag[offset+last_width] }for(j=1;j<last_height;j++){for(i=1;i<last_width;{Mx=img_8u1_src[(j+1)*img_width+(i+1)]+2*img_8u1_src[j*img_width+(i+1)]+img_8u1_src[(j-1)*img_width+(i+1)];Mx-=img_8u1_src[(j+1)*img_width+(i-1)]+2*img_8u1_src[j*img_width+(i-1)]+img_8u1_src[(j-1)*img_width+(i-1)];Mx=My=img_8u1_src[(j+1)*img_width+(i+1)]My-=img_8u1_src[(j-1)*img_width+(i+1)]2*img_8u1_src[(j-1)*img_width+i]+img_8u1_src[(j-1)*img_width+(i-1)];My=(My>>2);M=(int)(sqrt(Mx*Mx+My*My)if(M<img_8u1_mag[j*img_width+i]=img_8u1_mag[j*img_width+i]=}}}下的最重要原因,即效率如此低下的主要症结在于sqrt函数(上述代码中红色 My MMx
MyM码完成图像及实时梯度幅度图像获取程序(光盘中提供,源代码\优化示例\cameraMag02.rar,发板中运行,结果显示该函数的运行时间约17ms,可满足实时处理的需求。CMainDlg::CMainDlg(QWidget*parent):{m_table_sobel_sqrtnewunsignedchar[136900];inti,j;for(i=0;i<255;{intstep_start=intstep_end=(i+1)*(i+1);for(j=step_start;j<step_end;j++)m_table_sobel_sqrt[j]=}for(j=255*255;j<136900;m_table_sobel_sqrt[j]=}//Author:voidCMainDlg::sobel_mag_img(constunsignedchar*img_8u1_src, unsignedchar*img_8u1_mag, constint /*图像宽度constint /*图像高度constunsignedchar*table_sobel_sqrt)/*sobel开平方查找表,已事先计算{inti,j,intlast_width=img_width-intlast_height=img_height-1;intMx,My;offset=last_height*img_width; for(i=0;i<img_width;i++){img_8u1_mag[i]=img_8u1_mag[offset+i]=}for(j=0;j<img_height;{offset=j*img_width; img_8u1_mag[offset]=0;img_8u1_mag[offset+last_width] }for(j=1;j<last_height;j++){for(i=1;i<last_width;{Mx=img_8u1_src[(j+1)*img_width+(i+1)]+2*img_8u1_src[j*img_width+(i+1)]+img_8u1_src[(j-1)*img_width+(i+1)];Mx-=img_8u1_src[(j+1)*img_width+(i-1)]+2*img_8u1_src[j*img_width+(i-1)]+img_8u1_src[(j-1)*img_width+(i-1)];My=img_8u1_src[(j+1)*img_width+(i+1)]+2*img_8u1_src[(j+1)*img_width+i]+img_8u1_src[(j+1)*img_width+(i-1)];My-=img_8u1_src[(j-1)*img_width+(i+1)]+2*img_8u1_src[(j-1)*img_width+i]+img_8u1_src[(j-1)*img_width+(i-1)];img_8u1_mag[j*img_width+i]=}}}经过该优化步骤,您应该了解到查表的巨大了吧?通过建立一个的查找表,您可以同时避免sqrtif…else…的截断操作,使得算法的整体效率提升了近30倍。( (j* (j 1)*width (j*width ( (j* (width (j* ( (j* 码完成图像及实时梯度幅度图像获取程序(光盘中提供,源代码//Author:voidconstunsignedchar*img_8u1_src, unsignedchar*img_8u1_mag, constint /*图像宽度constint /*图像高度//Author:voidconstunsignedchar*img_8u1_src, unsignedchar*img_8u1_mag, constint /*图像宽度constint /*图像高度constunsignedchar*table_sobel_sqrt)/*sobel开平方查找表,已事先计算{inti,j,offset,intlast_width=img_width-intlast_height=img_height-1;intMx,My;intwidthL=img_width+1;intwidthS=img_width-offset=last_height*img_width; for(i=0;i<img_width;i++){img_8u1_mag[i]=img_8u1_mag[offset+i]=}for(j=0;j<img_height;{offset=j*img_width; img_8u1_mag[offset]=0;img_8u1_mag[offset+last_width] }for(j=1;j<last_height;j++){offset0j*img_width;for(i=1;i<last_width;{offset=offset0+i;Mx=img_8u1_src[offset+widthL]+(img_8u1_src[offset+1]<<1)+Mx-=img_8u1_src[offset+widthS]+(img_8u1_src[offset-1]<<1)+My=img_8u1_src[offset+widthL]+(img_8u1_src[offset+img_width]<<1)+img_8u1_src[offset+widthS];1)+img_8u1_src[offset-img_8u1_mag[offset]=}}} 2 1
1 第五章bl M
MM MarccosMxM
0, xM
INVALID_ f f
INVALID_INVALID_ INVALID_ arccosMx
180 arccos x table_arccos[i]=90 , [0,
x
arccos p M
梯度方向图像获取程序(光盘中提供,源代码\优化示例程序源代码CMainDlg::CMainDlg(QWidget*parent):{m_table_sobel_sqrtnewunsignedCMainDlg::CMainDlg(QWidget*parent):{m_table_sobel_sqrtnewunsignedchar[136900];inti,j;for(i=0;i<255;{intstep_start=intstep_end=(i+1)*(i+1);for(j=step_start;j<step_end;j++)m_table_sobel_sqrt[j]=}for(j=255*255;j<136900;m_table_sobel_sqrt[j]=//sobelarccostable_arccos[i]=90/pi*arccos(0.005*i)for(i=0;i<=200;i++)m_table_sobel_acos[i]= }//Author:voidCMainDlg::sobel_ori_img(constunsignedchar*img_8u1_src, unsignedchar*img_8u1_ori, constint /*图像宽度constint /*图像高度constunsignedchar*table_sobel_sqrt,/*sobel开平方查找表,已事先计算constunsignedchar*table_sobel_acos)/*arccos查找表,已事先计算好{intINVALID_VALUE=255;inti,j,offset,intlast_width=img_width-intlast_height=img_height-1;intMx,My,M;intwidthL=img_width+1;intwidthS=img_width-offset=last_height*img_width; for(i=0;i<img_width;i++){img_8u1_ori[i]=INVALID_VALUE;img_8u1_ori[offset+i]=INVALID_VALUE;}for(j=0;j<img_height;{offset img_8u1_ori[offset]=}for(j=1;j<last_height;j++){offset0j*img_width;for(i=1;i<last_width;{offset=offset0+i;Mx=img_8u1_src[offset+widthL]+(img_8u1_src[offset+1]<<1)+Mx-=img_8u1_src[offset+widthS]+(img_8u1_src[offset-1]<<1)+My=img_8u1_src[o
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 汽轮机辅机值班员岗前班组管理考核试卷含答案
- 展出动物保育员安全操作知识考核试卷含答案
- 阴阳极制作工安全培训效果模拟考核试卷含答案
- 陶瓷手工成型工班组协作测试考核试卷含答案
- 皮鞋制作工诚信道德评优考核试卷含答案
- 粉末冶金制品制造工岗前安全宣教考核试卷含答案
- 油脂化工产品制造工岗位知识强化考核试卷含答案
- 胶带机移设机司机操作知识测试考核试卷含答案
- 柠檬酸发酵工冲突解决能力考核试卷含答案
- 湖盐穿爆工岗前工作考核试卷含答案
- 2026秋国家开放大学网课《形势与政策》大作业答案
- 2026-2027学年高二语文上册第一次月考试卷原卷解析
- 成年人幽门螺杆菌感染诊断、治疗与预防临床实践指南(2026版)
- 2026年人教版七年级上册语文期中测试题
- 2026年国际贸易托收考试题库及答案
- 2026年湖南高考语文真题试卷(含答案)
- 2025年山西省全省工程系列建设工程专业高级工程师评审(建筑工程)训练题及答案
- 水库调度规程编制导则
- 《人工智能伦理》教学课件-2025-2026学年浙教版(新教材)初中信息技术九年级全册
- 2026届南京九年级语文中考二模标准模拟试卷第201套强证据校准版(含参考答案解析与作文范文)
- 重度颅脑损伤LUND概念培训课件
评论
0/150
提交评论