在嵌入式平台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库

DSP6657 EVM开发版
三、实验内容
step1:
准备一张图像,我采用lean.jpg, 512*512,单通道灰度图像。

lena_gray.jpg
step2:
打开C++ IDE,编写C++代码,将图像数据保存到为DSP可以加载的.dat文件。
本人采用vs2017+opencv3.4.0。

vs2017.jpg
#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;
}
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文件

.dat文件.png
在生成的.dat文件第一行添加如下内容:

.dat文件.png

.dat文件.png
Step3:
打开CCS8.1,配置环境。

ccs8.1.png

ccs.png
新建一个CCS工程

image.png
工程设置(如果要使用DDR3,需要加载gel文件)
.gel文件用于初始化DSP的参数,比如PLL锁相环,DDR3初始化。

image.png
配置imagelib库

imagelib库.png
其实与vs2017配置opencv相似,需要将imagelib库的.h,.lib(实际是.ae66)静态库加载到工程的搜索路径。
将.h文件加载到complier搜索路径。(点击工程,右键属性)

image.png
将.lib/.ae66加载到linker链接器的路径。

image.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:编译运行,观察结果
连接上仿真器

image.png
将之前生成的.dat文件导入内存

image.png

image.png

image.png
数据导入成功

image.png
观察导入的数据的图像,右键属性

image.png
设置参数

image.png
然后返回Image,右键refresh

image.png
激动人心的时刻
运行程序...观察Sobel算子的结果
更改地址,设置为dstImg的地址

image.png
刷新显示
铛铛铛...

image.png
以上就是TI DSP C6657加载图像,配置imglib库,图像处理的完整过程。在后续,我讲探索其他方式加载图像,喜欢的小伙伴请支持哦。