在嵌入式平台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库
三、实验内容
step1:
准备一张图像,我采用lean.jpg, 512*512,单通道灰度图像。
step2:
打开C++ IDE,编写C++代码,将图像数据保存到为DSP可以加载的.dat文件。
本人采用vs2017+opencv3.4.0。
- C++代码:
#include <stdio.h>
#include <stdlib.h>
#include<iostream>
#include<opencv2\opencv.hpp>
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\n", (int)image.at<uchar>(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: {}\n image size: {} x {} \n'.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{} {} {} {}\n'.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('{}\n'.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文件第一行添加如下内容:
Step3:
打开CCS8.1,配置环境。
新建一个CCS工程
工程设置(如果要使用DDR3,需要加载gel文件)
.gel文件用于初始化DSP的参数,比如PLL锁相环,DDR3初始化。
配置imagelib库
其实与vs2017配置opencv相似,需要将imagelib库的.h,.lib(实际是.ae66)静态库加载到工程的搜索路径。
将.h文件加载到complier搜索路径。(点击工程,右键属性)
将.lib/.ae66加载到linker链接器的路径。
若路径正确,工程将出现以下内容:
Step4:编写DSP端的代码
#include<stdio.h>
/*
* DSP导入图像数据
* 参考:https://blog.csdn.net/liu1guo2qiang3/article/details/43311965
* https://blog.csdn.net/luokh327/article/details/49617041
* Date:2018-8-22
* Author:Weipenghui
*/
#include<stdlib.h>
#include<imglib.h>
//#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:编译运行,观察结果
连接上仿真器
将之前生成的.dat文件导入内存
数据导入成功
观察导入的数据的图像,右键属性
设置参数
然后返回Image,右键refresh
激动人心的时刻
运行程序...观察Sobel算子的结果
更改地址,设置为dstImg的地址
刷新显示
铛铛铛...
以上就是TI DSP C6657加载图像,配置imglib库,图像处理的完整过程。在后续,我讲探索其他方式加载图像,喜欢的小伙伴请支持哦。