2011-11-18 20:48:50 liujia2100 阅读数 11752

毕设最终版了,还没完成,就开始答辩了,没有把摄像头加进去,也没有实现qt界面显示。哎!最终代码2500多行?实验代码写了4000多行。实验结果证明,我的设计某种程度是失败的:ARM9做这方面的图像处理真是意想不到的慢,整幅640*480的图像,处理完成,到最终结果显示,花费了将近6秒,比现有实用的慢了100倍,ARM做图像处理很不给力。

下面是ppt的截图和原始代码:

自报家门,开篇点题;





代码详细步骤,有时间贴上?有急需的,发邮件liujia1989911@126.com





2019-08-31 09:53:29 shenyan0712 阅读数 152

下载linux版本的arm-compute-library,解压出来即可使用。compute library支持neon和opencl方式,neon方式时利用原生的ARM的neon硬件进行加速。而opencl是一个并行计算框架,同时支持neon硬件和GPU硬件。由于现在使用的ARM的GPU还不支持OpenCL方式,因此就使用预编译库中的linux-armv7a-neon目录中的库文件。编译一个程序的命令如下:

arm-linux-gnueabihf-g++ examples/neon_convolution.cpp utils/Utils.cpp -I. -Iinclude -std=c++11 -mfpu=neon -L. -larm_compute -larm_compute_core -o neon_convolution

在eclipse中进行开发时,只需要像上面命名行一样配置好头文件目录,库文件目录以及库文件即可。

注意
当使用预编译版本的compute library时,在后面使用impott_memory出现段错误问题。所以按照官方法自行编译了neon版本的compute library,将动态库替换后问题得到解决。

图像的存取与转换

在Compute Library中数据都是按照张量的形式存储和使用的。数组为一维张量,图像为二维张量,而像神经网络中使用的卷积核可用三维张量描述。因此在Tensor.h中可以看到如下的一句:

using Image= Tensor;

也就是说Image是Tensor的一个别名而已。

图像读取

Compute Library在ImageLoader.h中提供了两个图像格式的文件读取类:PPMLoader和JPEGLoader,分别读取PPM和JPEG文件。它们读取图像的操作都很简单,以PPMLoader为列给出读取的代码:

Image img;
PPMLoader ppm;
ppm.open(filename);
ppm.init_image(img, Format::U8);    //根据图像文件尺寸和最终使用的图像格式,配置好img
img.allocator()->allocate();        //分配实际的存储空间
if(ppm.is_open())
    ppm.fill_image(img);            //将图像数据写入到img

JPEGLoader的使用是一样的。注意其中Format必须是U8或者RGB888。但看了一些功能使用的都是U8的格式。所以最好转为U8的格式。

图形的存储

在Utils.h中提供了一个函数用于将图像数据保持到PPM文件:

template <typename T>
void save_to_ppm(T &Tensor, const std::string &ppm_filename);

使用也很简单:

save_to_ppm(img, filename);     //img为Image对象

从已有memory配置Image对象

当处理来自摄像头的数据时,可能不需要再分配存储空间,直接使用原有的空间即可。而Image(Tensor)是支持的。代码如下:

Image img;
img.allocator()->init(TensorInfo(640,480, Format::YUYV422));       //这里假设读取到的摄像头数据是YUYV422格式的。
img.allocator()->import_memory((void*)mem);           //mem是指向摄像头数据地址的指针

YUYV422到RGB888的转换

之所以需要将YUYV422转换为RGB888是因为有很多摄像头的输出格式要么为YUYV422,要么为Motion-JPEG。而在图像处理时通常都是使用的RGB格式,因此必须进行格式的转换。
查看https://arm-software.github.io/ComputeLibrary/v19.05/文档,在右边的查找框中输入color可以列出一系列颜色格式转换的函数,其中便可以看到有我们所需要的YUYV到RGB的转换函数colorconvert_yuyv_to_rgb。但最终使用的是NEColorConvert.h中提供的NEColorConvert类提供的功能。

首先,假设摄像头数据存放在buffer_ptr指向的地址,并且已知图像的尺寸和格式为YUYV422,那么可以通过如下代码进行格式转换:

Image src_img, dst_img;
src_img.allocator()->init(TensorInfo(640,480,Format::YUYV422));
src_img.allocator()->import_memory(buffer_ptr);     //使用指向原始数据的指针
dst_img.allocator()->init(TensorInfo(640,480,Format::RGB888));
dst_img.allocator()->allocate();                    //分配一块空间,存放转换后的图像
NEColorConvert convert;
convert.configure(&src_img, &dst_img);
convert.run;    //执行转换
save_to_ppm(dst_img, "test.ppm");
2018-02-26 14:47:26 sanallen 阅读数 745

参考文档

  1. https://en.wikipedia.org/wiki/Reduction_Operator

计算优化类术语

Reduction(约简)

在计算机科学中,reduction表示一种运算符类型(满足交换律[Commutative]、结合律[Associative]),常见于并行编程,用来缩减阵列中的元素到单个输出结果。reduction运算符可以将一个计算任务分解为一系列小局部任务,对于一个任务需要满足如下几点才能够使用reduction运算符进行计算:

  • 任务能够从一个阵列缩减为单个标量值
  • 最终的结果能够从各个局部任务中获得

那具体什么运算可以通过reduction来进行并行计算的?

举例:加法[Sum]、乘法[Product]、逻辑算法[And/Or/Xnor/…]、求平均数[Average]都可以使用reduction。

另外还有直方图计算[Histogram]、卷积运算[Convolution]

那有什么运算是不可以通过reduction来进行并行计算的?

举例:矩阵乘法[Matrix Multiplication],因为矩阵乘法不满足交换律。

Tiling(分块)

Split(循环分解)

Unroll(循环展开/平铺)

Interleave(交错)

Reorder(循环重排序)

Vectorize(向量化/SIMD)

Parallel(并行化)

Fusion(融合)

调度类术语

Stage(阶段)

Pipline(流水线)

Schedule Within Stages(阶段内调度)

Schedule Across Stages(阶段间调度)

Inline Schedule(内联调度)

正在补充中…

2019-06-09 15:34:18 YEYUANGEN 阅读数 251

机器视觉就是使用机器来模拟人类视觉的功能,对图像进行测量和判断。它是实现仪器设备精密控制、智能化、自动化的有效途径。使用机器视觉可以完成很多人类无法完成的任务,同时有助于提高产品质量,提高生产效率。机器视觉系统的研究具有重大意义以及广阔的市场前景,而高速以及一体化、个性化是机器视觉系统的发展方向,就需要有一款嵌入式通用高速图像采集处理硬件平台来适应机器视觉的发展。目前国内的机器视觉厂商主要还是以代理国外的产品为主,包括其中的硬件产品,特别是针对高端应用的高速高分辨率应用的硬件。国内的机器视觉厂商也意识到需要发展自己的产品,而且也有一些研究机构对图像处理的硬件进行研究,但是主要还是在低端应用。因此本文针对机器视觉系统中的高速图像采集处理硬件平台进行研究,设计出一款基于FPGA+DSP的嵌入式通用高速图像采集处理硬件平台(Embedded General High-speed Image Acquisition and Processing Platform, EGHIAPP),并就其中的高速图像采集、压缩以及存储通用关键问题进行研究。

基于DSP+FPGA框架的平台结构灵活、通用性较强,适合于模块化设计,能较大程度的提高图像处理的稳定性,并且开发周期较短,容易进行扩展和升级。在该硬件平台中,较简单的底层算法、系统管理、任务分配和逻辑控制等适合于使用FPGA处理器实现,而复杂的核心图像算法,适合使用运算速度快、寻址方式灵活的DSP处理器实现,两者能实现明显的优势互补。

设计一种基于AM5728 DSP和FPGA架构的通用图像处理平台,运用FPGA实现微处理器接口设计,并对图像数据进行简单预处理,利用DSP进行复杂图像处理算法和逻辑控制,实现图像数据的高速传输与实时处理。系统可应用于贴片机芯片检测中,并进行性能评估实验。论文研究的主要内容如下:1、根据机器视觉的发展方向,提出了在机器视觉应用中的高速图像处理平台需要具备的功能,并就此功能设计完成了基于FPGA+DSP的通用高速图像处理的硬件平台。2、针对AM5728 Camera Link和GigE相机的图像采集问题进行研究,对两种接口相机的图像数据采集的详细工程实现以及其中的难点进行了设计,最后分别针对两种典型的相机MC1362以及piA2400实现高速图像采集。3、针对实时采集的高速图像的JPEG压缩问题进行了研究,解决高速压缩中的速度问题以及传统方案中的需要大容量缓冲问题,并对多路并行压缩方法进行研究,实现单FPGA芯片对piA2400的500万像素高分辨率彩色图像以及MC1362的500帧/秒超高速灰度图像的JPEG实时压缩。4、针对图像的实时大容量存储问题进行研究,使用FPGA实现SATA硬盘的数据读写功能,对影响硬盘速度的原因进行分析,采用了硬盘扇区直接顺序读写的方式提高硬盘的存储速度。并对多路硬盘的并行存储技术进行研究,以两路硬盘存储为例,给出并行存储的方案。5、采用AM5728完成了机器视觉系统中的两个典型应用,说明本平台具有良好的通用性。

其它应用:为改善红外焦平面阵列成像质量与实时性要求,提出了以高速信号处理器为核心的红外焦平面实时图像数字处理系统.

2012-04-18 13:59:56 yuyin86 阅读数 4524
实时图像处理、高速数据运算处理要求其系统具有对数据处理速度快、数据吞吐率高以及多任务处理功能。目前大多数方案都是采用HPI数据传输方式,将ARMDSP进行组合完成一些图像处理,DSP处理器只是完成图像采集、压缩、编码等简单的处理[1]工作,不能满足实时的智能识别或大数据量运算的视频处理要求。在应用领域方面也会因其处理速度问题受到一定的限制。
    例如,胎儿性别屏蔽项目中,要对实时视频进行性别部位的检测和屏蔽,若采用单DSP则会出现漏帧或视频不流畅;应用于高速运动物体跟踪时,单DSP无法实现实时运动物体跟踪,例如汉王科技的运动检测和海康威视运动检测,都不能实时检测,即使检测也会出现漏检现象和视频不流畅。当处理4CIF或者更大图像时,单DSP的处理能力又会下降,虽然可以将图像缩小进行处理,但是缩小图像则会丢失一些重要的图像信息,使得智能识别准确率下降。
    针对上述情况,设计一种能够实现进行快速信号处理和数据交换的实时图像处理系统很有必要。
1 系统结构
1.1 结构
    系统功能:利用S3C6410进行数据整合、任务调度、人机交互;利用TMS320C6416进行算法运算;每个DSP与FPGA都是无缝连接。设计中利用FPGA实现的FIFO进行与DSP之间的高速数据传输以及ARM对多个DSP的任务调度处理等。
    系统结构如图1所示。系统由1个ARM11处理器S3C6410(主处理器)与4个TMS320C6416(720 Hz)(从DSP)通过FPGA(EP2C70~7)实现互联的ARM+多DSP的嵌入式图像处理系统。所有的DSP都通过外部存储器接口(EMIF)与FPGA无缝相连,每个DSP之间的数据传输是通过FPGA内部互联FIFO网络实现。

    图2所示是一种互联的FIFO网络结构和高速数据传输网络结构。主处理器通过DMA数据访问模式与FPGA的双口FIFO连接,从而实现与FPGA通过FIFO连接的所有从DSP进行通信,所有FIFO都是双向的,FIFO及其读写控制逻辑都在FPGA内部实现。

    FPGA中的FIFO读写状态控制、各从DSP之间通信的同步握手信号、S3C6410处理器数据请求等逻辑信号,都是由每个DSP的一部分GPIO口与EP2C70的I/O口连接实现。
1.2 特点
    系统结构具有可重构特性,在硬件平台不变情况下,只需通过改变FPGA程序代码就可以完全改变系统结构,以适应不同的算法结构。如图2中屏蔽DSP1~DSP4之间的互相通信,即可组成主从并行的流水线结构;若需要串行的流水线结构,只需将DSP1~DSP4的其中一个与S3C6410通信即可;若需要设计更复杂的串并混合性结构,也只需改变FPGA的代码就能够很容易地实现。

2 S3C6410的DMA与FPGA的软FIFO
   接口实现
2.1 S3C6410简介
    S3C6410是三星公司的产品采用ARM1176JZF-S核,包含16 KB的指令数据Cache和16 KB的指令数TCM;ARM Core电压为1.1 V时,可以在553 MHz下运行。在1.2 V时,可以在667 MHz下运行。通过AXI、AHB和APB组成的64/32 bit内部总线与外部模块相连。SROM Controller:6个片选,支持SRAM、ROM和NOR Flash以及支持8/16 bit,每个片选支持128 MB。JPEG Codec:支持JPEG编解码功能,最大尺寸为4 096×4 096。2D GRAPHICS:2D加速,支持画点/线,bitblt功能和Color Expansion。3D GRAPHICS:3D加速。
    S3C6410可支持4个DMA控制器,用于系统总线内部或与外围总线之间的数据交换,每个控制器包含8个通道,支持8/16/32 bit传输。现以外部DMA请求为例简要介绍DMA的工作过程。图3所示为DMA基本工作时序。

    当需要进行DMA操作时,外部DMA请求引脚XnXDREQ置为低电平。此时DMA控制器向CPU发出占用总线的请求,当总线请求成功后,XnXDACK引脚变为低电平,表示CPU已经将总线使用权交给DMA控制器,可以进行数据传输。当数据传输完成后,应答信号XnXDACK置为高电平,通知CPU完成一次DMA操作。
    S3C6410提供了三种不同的DMA操作模式:单服务命令模式、单服务握手模式和全服务握手模式。在利用DMA进行数据传输前必须对其相关寄存器进行设置,包括源地址寄存器、目的地址寄存器和各自的控制寄存器以及配置DMA模式的控制寄存器等。
2.2 FPGA及其实现FIFO[2]
    采用FPGA 实现多时钟电路系统时,需要处理不同的时钟域之间速率匹配问题,可利用FPGA内部生成的异步FIFO来处理。异步FIFO主要由双端口RAM、写地址产生模块、读地址产生模块、满空标志产生模块组成。双端口RAM由FPGA的Block RAM块构成,FPGA采用Atera公司的EP2C70-896C7,其Block RAM读写时钟频率可以达到216.73 MHz,因此选用Block RAM作为存储体,不仅速度快,而且设计简单。设计时,一个端口配置成写端口,另一端口配置成读端口,然后把Block RAM 的管脚与相对应的控制信号相接即可。读写地址通过FPGA芯片内部的二进制进位逻辑产生,以对应Read_En/Write_En作为使能信号在读/写时钟的控制下进行计数。空或满标志可以由读或写地址的相对位置来获得。本系统采用2个FIFO组成一路数据传输通道,双向FIFO的设计图如图4所示。

2.3 S3C6410的DMA与软FIFO接口实现
    根据DMA接口原理,设计S3C6410与FPGA之间的接口简图如图5所示。

    读时钟由ARM的时钟输出引脚CLKOUT0提供。CLKOUT0根据S3C6410内部寄存器的设置可以输出不同的时钟频率。FIFO输出数据经过以nGCS4为选通信号的缓冲器(Buffer)后接到S3C6410的数据总线上。nGCS4是S3C6410存储空间中BNAK4的片选信号,当S3C6410对该信号对应存储空间进行读写操作时,BANK4为低电平,其余时间均为高电平。
  FIFO的写请求信号由S3C6410与FIFO的满状态共同控制。当S3C6410发出START信号并且FIFO未满时,写请求信号为高电平,FIFO在写时钟的控制下写入数据;当START信号撤销或者FIFO满时,写请求信号变为低电平,停止写操作。
     FIFO的读操作与S3C6410的DMA操作配合进行。系统采用单服务命令模式的DMA操作,每次传输一个字节的数据。当DREQ0信号变为低电平时,DMA操作开始,每次传输一个字节后产生一个DACK0应答信号,而且只要DREQ0为低电平DMA操作就继续进行,直到DMA控制寄存器中的计数器为0,产生DMA中断。根据上述时序特点,将FIFO的空信号作为DMA的请求信号DREQ0。当CCD输出的数据写入FIFO中时,空信号跳变为低电平启动DMA操作,同时以DACK0信号作为FIFO的读请求。每次DMA传输完成后应答信号使FIFO的读指针移动一位,以实现数据的快速准确采集。
3 图像采集模块
    用可编程视频输入处理器SAA7113H进行视频信号处理。SAA7113H内部集成了强大图像色度、亮度处理功能以及多种输出模式[3];有32个工作寄存器,在系统复位时,必须通过I2C总线对其进行初始化。本系统使用灰度图像,没有使用色度信号,所以数据线为8 bit。SAA7113H与FPGA的接口如图6所示。

    在本系统中,FPGA内部需要设计一逻辑时序完成图像数据的采集,数据的传输采用异步FIFO完成。采用此方案可以解决CCD输出数据频率与从DSP和ARM不匹配的问题。
4 DSP的EMIFA与FPGA实现的软FIFO接口
4.1 DSP的EMIFA接口[4-5]
    DSP(TMS320DM6416T)之间的通信都是通过外部存储器接口(EMIFA)访问片外存储器进行的。EMIFA由64 bit数据线D[63:0]、20 bit地址线A [22:03]、 8 bit字节使能线BE[7:0]、4 bit地址区域片选线/CE3~/CE0和各类存储器的读/写控制信号组成。TMS320DM6416T 的每个
/CEx空间都有256 MB寻址空间,并且可配置为与SRAM、SDRAM、ZBTSRAM、Flash、FIFO等各类存储器接口。EMIFA读/写各类存储器的时钟可由软件配置为EMIF的AECLKIN、CPU/4或CPU/6。本设计配置为EMIF的AECLKIN,且为133 MHz。
4.2 EMIF与软FIFO接口实现
    DSP之间通过EMIF口与FPGA实现的异步FIFO进行通信。EMIF异步接口的每个读/写周期分为三个阶段:建立时间(SETUP)、触发时间(STROBE)、保持时间(HOLD),且每个阶段时间可编程设置,以适应不同的读写速度。DSP读写异步FIFO的时序图分别如图7、图8所示[6]。DSP读写FIFO控制信号由FPGA产生,其逻辑关系如下:
    写FIFO信号:writ_clk= AECLKOUT
               writ_req=! (/CE+/AWE)
    读FIFO信号:read_clk = AECLKOUT
               read_req = ! (/CE+/ARE)


    另外,写FIFO的DSP要相应为满状态标志,读FIFO的DSP则相应为半满状态标志。
5 DSP之间数据通信[7]
    为了设计一款通用性比较强的图像处理平台,各处理器间的数据传输必需达到通用性,这样可以针对不同系统的应用,只须修改图像处理算法代码,而不须要修改各处理器之间的通信。具体设计分为如下两部分:
 (1) 数据通信协议说明(x=0,1,2,3)
 Se/Re (Send/Receive)[0]:ARM通过FPGA请求DSPx接收(该数据位为1)或发送。
 ARM[1:3]:该段数据为DSPx向FPGA发出请求数的DSP编号。
    DSPx[4:6]:ARM处理器向FPGA提出要求响应的DSP的编号。
    Da_Le(Data_Leng)[7:18]:ARM请求DSPx接收或发送的数据长度。
 Da_Un (Data_Unit)[19]:该标志位表示是否按照Data_leng*K(1K=1 024 bit)的数据长度传输数据,若为1,表示接收或发送数据长度为Data_leng*K(1K=1024 bit);若为0,表示接收或发送数据长度为Data_leng。
 Da_Bl (Data_Block)[20:27]:该数据表示ARM请求DSPx接收或发送Data_Block个Data_leng K或Data_leng数据块。
 Da_Ch(Data _Result)[7:18]:ARM请求DSPx接收或发送的算法代码中间运行结果或最终结果,此数据段与Data_Leng共用。
    In_Pr (Interrupt _Priority) [27:30]:设置DSP的中断优先权。
    Ot_Use (DSP_State) [31:34]:DSP状态标志信息。
 
    Ot_Use (Other_Use) [36:47]:用户自定义数据段。
 (2) 数据通信主要流程
 首先,FPGA接收到ARM[1:3]处理器的请求信号,然后根据Data[0:34]计算出校验数据SUM与Parity_Check[35]比较,若不等,则FPGA向ARM处理器重新发请求信号;若相等、且DSPx为空闲状态时,则FPGA由Send/Receive向DSPx发送接收或发送数据请求,并将采集到的图像数据传输给DSPx,同时使能对应的FIFO数据通道;DSPx根据收到的数据信息,同样计算出校验数据,若与Parity_Check相等,则根据Send/Receive标志位,采用EDMA方式向EMIF口接收或发送Data_Block* Data_leng(或Data_Block* Data_leng K)数据。如果FPGA同时接收到2个或2个以上的DSPx数据传输请求信号,则FPGA根据Interrupt _Priority端口数据判其执行的先后顺序。
6 系统的性能分析[7]
 影响系统性能的主要因素有:ARM处理器协调工作的响应速度、DSP处理数据的速度、数据在多处理器之间的传输速度。前两个因素主要由处理的主频和处理能力决定,因此不做测试。数据在处理器之间的传输速度则是本设计的主要部分之一,而数据传输带宽和数据传输延迟是衡量数据传输速度的重要指标。
 若系统中DSP读写FIFO的带宽为B(单位时间内DSP间的数据传输量),则:
  
    表1是ARM处理器分别与DSP1~DSP4传输不同大小数据时测得的平均延迟时间,图9是根据测试数据绘出的实际带宽Bf曲线。可以看出,随着传输的数据增大,Bf逐渐逼近B的266 MB/s的理论值。

     本文基于ARM、FPGA、多DSP设计的实时图像信号处理系统,使用FPGA芯片设计的一种高速数据传输网络互联结构,使得该系统的数据通信能力和DSP的运算能力能很好地匹配;通过数据传输控制总线,使得数据传输十分灵活;利用S3C6410对图像数据传输的调度,图像数据处理任务的分配,图像保存、显示、网络传输;利用4个TMS320C6416T对图像做算法处理。经测试,算法代码在单DSP(TMS320C6416T 1 GHz)平台下其处理时间小于0.2 s,而在本文平台下其处理时间小于40 ms,可以满足实时要求。另外,该系统可广泛适用于其他图像处理、电子对抗、雷达信号处理等各个领域。
参考文献
[1] 曹理发.尹勇.刘恒辉,等.基于ARM和DSP的视频监控系统设计与实现[J].电子器件,2009,32(1).
[2] Cyclonce Inc. Cyclone II device handbook. 2005.
[3] 龙再川,赵凯生,洪明坚,等. ARM系统中DMA方式在数据采集中的应用[J].国外电子元器件,2007(2).
[4] Texas Instruments Incorporated.TMS320C6414,TMS320C6415, TMS320C6416FIXED-Point digital signal processor,2007.
[5] 李方慧,王飞,何佩琨. TMS320C6000系列DSPs原理与应用(第二版)[M].北京:电子工业出版社,2005.
[6] Texas Instruments Incorporated. TMS320C6000 EMIF to external FIFO interface.1999.
[7] 周委,陈思平,赵文龙,等. 基于DSP EMIF口、FPGA设计并实现的多DSP 嵌入式系统[J]. 电子技术应用, 2008,34(12):6-8.

Opencv嵌入式图像处理

博文 来自: sx1503198
没有更多推荐了,返回首页