DSP

TI DSP C6657导入图像数据进行图像处理

2019-07-13 10:55发布

在嵌入式平台DSP上进行图像处理,首先要解决的问题是如何将PC端的图像加载到DSP内存中。如果熟悉数字图像处理,我们一般用Matlab,Python,opencv 直接imread("lena.jpg")就可以了,一行代码搞定。 可是到了DSP平台,这样简单的imread()功能并没有。

一、目的

1.将windows本地的图像导入DSP的内存中。 2.利用DSP6657的官方图像处理库——imagelib实现Sobel算子

二、工具

1.TI DSP6657 EVM官方评估版 2.CCS8.1 3.C++ 编译器,这里采用Visual Studio2017 4.TI 6657 imagelib库 11478104-10798aff614b7c59.jpg DSP6657 EVM开发版

三、实验内容

step1:

准备一张图像,我采用lean.jpg, 512*512,单通道灰度图像。
11478104-3ac854dd36bfb08a.jpg lena_gray.jpg

step2:

打开C++ IDE,编写C++代码,将图像数据保存到为DSP可以加载的.dat文件。
本人采用vs2017+opencv3.4.0。
11478104-ca3763afbae710eb.jpg vs2017.jpg
  • C++代码:
#include #include #include #include using namespace std; using namespace cv; int main(void) { //------------将图像文件生成.txt------------------------- string fileName = "F:\lena\lena_gray.jpg"; Mat image = imread(fileName, 0); FILE* fp = fopen("F:\lena\lena_gray_512x512.dat", "wb"); for (int i = 0; i < image.rows; i++) { for (int j = 0; j < image.cols; j++) { //写入数据 fprintf(fp, "%x ", (int)image.at(i, j)); } } return 0; }
  • python代码
import cv2 import os import argparse def main(): arg_parser = argparse.ArgumentParser() arg_parser.add_argument('image_path') arg_parser.add_argument('dsp_data_path') args = arg_parser.parse_args() image_path = args.image_path dsp_data_path = args.dsp_data_path assert os.path.isfile(image_path) dsp_file = open(dsp_data_path, 'w') image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE) # assert image is None print('-'*20) print('image name: {} image size: {} x {} '.format(image_path, image.shape[1], image.shape[0])) print('dsp format data defualt start addr: 0x80000000, you should change it later!') ans = input('Continue ? (Y/N)') if ans in ['yes', 'y', ' Y', 'YES', 'Yes']: # DSP DATAHEADER dsp_file.write('{} {} 0x{} {} {} {} '.format(1651, 9, 80000000, 0, hex(image.shape[0] * image.shape[1]), 10)) for i in range(image.shape[0]): for j in range(image.shape[1]): pixel = image[i, j] dsp_file.write('{} '.format(hex(pixel))) dsp_file.close() print('Create dsp format data finish!') elif ans in ['no', 'N', ' n', 'NO', 'No']: pass else: print('You pressed error key!') if __name__ == '__main__': main() 将图像用opencv读取,C++生成的.dat文件
11478104-084e6abe8a22ea3b.png .dat文件.png 在生成的.dat文件第一行添加如下内容:
11478104-a699f425ce193613.png .dat文件.png 11478104-20fdebdf465f4f70.png .dat文件.png

Step3:

打开CCS8.1,配置环境。 11478104-d40d56a2823f5cea.png ccs8.1.png
11478104-34ea50ebd56e2a1b.png ccs.png 新建一个CCS工程
11478104-dcc6d88a3f9ccda3.png image.png 工程设置(如果要使用DDR3,需要加载gel文件)
.gel文件用于初始化DSP的参数,比如PLL锁相环,DDR3初始化。
11478104-f1c70dcd4ee2c114.png image.png 配置imagelib库
11478104-1d1e832a529912b5.png imagelib库.png 其实与vs2017配置opencv相似,需要将imagelib库的.h,.lib(实际是.ae66)静态库加载到工程的搜索路径。 将.h文件加载到complier搜索路径。(点击工程,右键属性)
11478104-3c8b50e1d5ea2d6a.png image.png 将.lib/.ae66加载到linker链接器的路径。
11478104-c4d88428b91df1b3.png image.png 若路径正确,工程将出现以下内容:
11478104-0fe8c88b78f8d0be.png image.png

Step4:编写DSP端的代码

#include /* * DSP导入图像数据 * 参考:https://blog.csdn.net/liu1guo2qiang3/article/details/43311965 * https://blog.csdn.net/luokh327/article/details/49617041 * Date:2018-8-22 * Author:Weipenghui */ #include #include //#include"image_array.h" typedef unsigned char uint8; const int WIDTH = 512; const int HEIGHT = 512; int main(void) { //-------------------------------方式1-------------------------------------------------------- /*将图像用matlab/python/C++/Java等生成.dat文件,连接上DSP核之后,在Memory Brower中load Memory即可 * 特点:导入数据速度快,但是相对繁琐 * */ uint8* srcImg1 = (uint8*)0x80000000; //DDR3地址,原始图像 uint8* dstImg = (uint8*)0x80050000; //DDR3地址,处理后的结果 //DSP ImageLib sobel算子 IMG_sobel_3x3_8(srcImg1,dstImg,512,512); }

Step5:编译运行,观察结果

连接上仿真器
11478104-328d5bb205eb5580.png image.png 将之前生成的.dat文件导入内存
11478104-91453ca50d88ca14.png image.png
11478104-86177a2f03692b79.png image.png
11478104-8166d40018c34f0e.png image.png 数据导入成功
11478104-ab6465451ee894e6.png image.png 观察导入的数据的图像,右键属性
11478104-0a68d15ee70bcbcd.png image.png 设置参数
11478104-af15f480ca3955fc.png image.png 然后返回Image,右键refresh
11478104-2be58230ba325e6e.png image.png 激动人心的时刻
运行程序...观察Sobel算子的结果 更改地址,设置为dstImg的地址
11478104-290e2d88e5ad4060.png image.png 刷新显示
铛铛铛... 11478104-fc83b728fd8ba883.png image.png
以上就是TI DSP C6657加载图像,配置imglib库,图像处理的完整过程。在后续,我讲探索其他方式加载图像,喜欢的小伙伴请支持哦。