1、实验目的
图像信息量巨大,而边缘信息是图像的一种描述,是图像最基本的特征,所包含的也是图像中用于识别的有用信息。所谓边缘是指其周围像素灰度有阶跃变化或屋顶变化的那些像素的集合,边缘存在于目标、背景和区域之间,所以,它是图像分割所依赖的最重要的依据。由于边缘是位置的标志,对灰度的变化不敏感,,因此,边缘也是图像匹配的重要的特征。图像边缘为人们描述或识别目标以及解释图像提供了一个有价值的和重要的特征参数,其算法的优劣直接影响着所研制系统的性能。
2、实验内容
1)Linux平台:
(1)硬件结构图:
(2)程序流程图:
(3)核心代码与关键技术:
ARM 端源代码与视频采集回放实验完全一致。
package.xdc:该文件中定义了该 codec 包的静态属性,如 codec 名称和关联包。 如下面代码定义了 该 codec 包 的 名 称 为 codecs.vidsobeledge , 包 含 了 1 个 简 单 的 算 法 叫VIDSOBELEDGE。
package codecs.vidsobeledge {module VIDSOBELEDGE;}
VIDSOBELEDGE.xs:该文件内容是模块的实现,文件名称 VIDSOBELEDGE 必须和 package.xdc 文件中定义的模块名称一致。文件中包含了 VIDSOBELEDGE.xdc 中声明的方法的实现。
videnc_copy.c:该文件包含了 codec 的 xDM 接口的 8 个接口函数实现。该文件和前两个实验中codec/videnc_copy 中提供的函数实现基本一致,process 函数有区别,前两个实验中只是将输入的视频数据进行了一下空间的搬移,而在本实验中进行了边缘检测处理。
XDAS_Int32 VIDENCCOPY_TI_process(IVIDENC_Handle h, XDM_BufDesc *inBufs, XDM_BufDesc *outBufs, IVIDENC_InArgs *inArgs, IVIDENC_OutArgs *outArgs){ …
UYVY_to_YUY2(inBufs->bufs[curBuf],tmp1);IMG_sobel(tmp1,tmp2,720,576);YUY2_to_UYVY(tmp2,outBufs->bufs[curBuf]); …
边缘检测算法函数使用了img64x.lib中提供的 sobel 算子算法。
void IMG_sobel(const unsigned char *in_data, /*
Input image data */unsigned char *out_data, /*
Output image data */short cols, short rows /*
Image dimensions */);
2)CCS平台:
(1)硬件结构图:
(2)程序流程图:
(3)核心代码与关键技术:
边缘检测是基于对图像灰度差异运算实现的,所以如果输入的是RGB彩 {MOD}图像,需要先进行灰度图的转换。
RGB转换成灰度图像的一个常用公式是:
Gray = R*0.299 + G*0.587 + B*0.114
//******************灰度转换函数*************************
//第一个参数image输入的彩 {MOD}RGB图像;
//第二个参数imageGray是转换后输出的灰度图像;
//*************************************************************
void ConvertRGB2GRAY(const Mat &image,Mat &imageGray)
{ if(!image.data||image.channels()!=3) { return ; }
imageGray=Mat::zeros(image.size(),CV_8UC1); uchar *pointImage=image.data; uchar *pointImageGray=imageGray.data; int stepImage=image.step; int stepImageGray=imageGray.step;
for(int i=0;i
3、实验步骤
1)实验准备:
(1)配置好串口终端(具体操作参考 4.2 节) ;
(2)用串口线一端连接 PC 机串口, 另一端连接 SEED-DTK6446 实验箱 RS232 串口 J3;
(3)使用网线将 SEED-DTK6446 实验箱和 linux 开发主机都连接到局域网上;
(4)将摄像头连接到视频输入口 J27;
(5)将视频显示设备连接到视频输出口 J13。
2)Linux平台操作步骤:
(1)在 linux 主机上打开终端,进入实验程序 codec 算法包所在目录
Host # cd /opt/dvevm_1_20/seed_exp/05.videosobel/codecs/vidsobeledge
(2)重新编译 codec 算法包
Host # make clean
Host # make
(3)进入实验程序 ARM 端所在目录
Host # cd /opt/dvevm_1_20/seed_exp/05.videosobel/video_sobel_app
(4)重新编译应用程序。
Host # make clean
Host # make
(5)复制编译生成的可执行文件到 NFS 根文件系统中
Host # cp release/video_sobel_app /opt/nfs/opt/seed_exp
(6)进入实验程序 DSP 端所在目录
Host # cd /opt/dvevm_1_20/seed_exp/05.videosobel/servers/vidsobeledge
(7)重新编译 DSP Server。
Host # make clean
Host # make
(8)复制编译生成的. x64P 文件到 NFS 根文件系统中
Host # cp vidsobeledge.x64P /opt/nfs/opt/seed_exp
(9)将系统配置为从 NFS 根文件系统启动
(10)启动系统后,登陆系统,进入可执行文件所在目录
root @ xxx.xxx.xxx.xxx:~#cd /opt/seed_exp
(11)加载 cmemk.ko 和 dsplinkk.ko 模块
root @ xxx.xxx.xxx.xxx:/opt/seed_exp#./loadmodules.sh
(12)执行应用程序
root @ xxx.xxx.xxx.xxx:/opt/seed_exp#./video_sobel_app
视频显示设备上将实时的显示采集的经算法处理的图像。
3)CCS平台操作:
(1)打开 CCS5.3 并导入现有工程到软件中,点击 File,选择 File-->Import,在弹出的对话框中选中 sobel 添加该工程文件;
(2)设置编译与连接选项;
(3)设置目标配置文件,点击 File,选择 File → New → Target Configuration File;
(4)配置 ARM 端;
(5)编译工程, 点击 Project →Build Project, 对工程进行编译, 如正确则生成 .out 文件;
(6)使用 Run→Load→Load Program 菜单命令,装载 composite_loop.out 文件,进行调试,.out 文件一般存放在程序文件夹的 debug 文件夹中;
(7)运行程序,可在视频 LCD 上看到前端实时处理的边缘检测图像。
4、实验结果与分析
(详细的实验结果,图/表/文相结合,并对实验结果及实验中遇到的问题进行较全面的对比分析,阐述解决方案,通过测试或实验分析其有效性)
1)实验结果及分析
(1)Linux平台结果: (2)CCS平台结果:
(3)结果分析:根据实验结果,我们发现css平台下和linux平台下都实现了边缘检测。由实验结果分析,边沿还是比较模糊,证明算法中sobel算子在进行阈值分割时的阈值不太合适,导致边沿虽然能勾画出物体轮廓,但不能很有效清晰的绘制出边缘图像。因此,该sobel算子还有可以改进的空间,例如,根据图像的特点可以采用动态阈值的方法进行分割监测,但是缺点是运算量会大大增加。下一步会进行动态阈值分割算法的改进。
链接:12-2018.01-数字信号处理《基于CCS和Linux平台的图像边缘检测算法开发及图像处理》 密码:k77w