在嵌入式平臺DSP上進(jìn)行圖像處理全闷,首先要解決的問題是如何將PC端的圖像加載到DSP內(nèi)存中凿将。如果熟悉數(shù)字圖像處理,我們一般用Matlab,Python,opencv 直接imread("lena.jpg")就可以了,一行代碼搞定山涡。 可是到了DSP平臺,這樣簡單的imread()功能并沒有阐肤。
一抬闯、目的
1.將windows本地的圖像導(dǎo)入DSP的內(nèi)存中。
2.利用DSP6657的官方圖像處理庫——imagelib實(shí)現(xiàn)Sobel算子
二语婴、工具
1.TI DSP6657 EVM官方評估版
2.CCS8.1
3.C++ 編譯器描孟,這里采用Visual Studio2017
4.TI 6657 imagelib庫
三、實(shí)驗(yàn)內(nèi)容
step1:
準(zhǔn)備一張圖像砰左,我采用lean.jpg, 512*512匿醒,單通道灰度圖像。
step2:
打開C++ IDE,編寫C++代碼缠导,將圖像數(shù)據(jù)保存到為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++) {
//寫入數(shù)據(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文件第一行添加如下內(nèi)容:
Step3:
打開CCS8.1蜜另,配置環(huán)境适室。
新建一個(gè)CCS工程
工程設(shè)置(如果要使用DDR3,需要加載gel文件)
.gel文件用于初始化DSP的參數(shù)举瑰,比如PLL鎖相環(huán)捣辆,DDR3初始化。
配置imagelib庫
其實(shí)與vs2017配置opencv相似此迅,需要將imagelib庫的.h汽畴,.lib(實(shí)際是.ae66)靜態(tài)庫加載到工程的搜索路徑。
將.h文件加載到complier搜索路徑耸序。(點(diǎn)擊工程忍些,右鍵屬性)
將.lib/.ae66加載到linker鏈接器的路徑。
若路徑正確坎怪,工程將出現(xiàn)以下內(nèi)容:
Step4:編寫DSP端的代碼
#include<stdio.h>
/*
* DSP導(dǎo)入圖像數(shù)據(jù)
* 參考: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中l(wèi)oad Memory即可
* 特點(diǎn):導(dǎo)入數(shù)據(jù)速度快搅窿,但是相對繁瑣
* */
uint8* srcImg1 = (uint8*)0x80000000; //DDR3地址嘁酿,原始圖像
uint8* dstImg = (uint8*)0x80050000; //DDR3地址,處理后的結(jié)果
//DSP ImageLib sobel算子
IMG_sobel_3x3_8(srcImg1,dstImg,512,512);
}
Step5:編譯運(yùn)行,觀察結(jié)果
連接上仿真器
將之前生成的.dat文件導(dǎo)入內(nèi)存
數(shù)據(jù)導(dǎo)入成功
觀察導(dǎo)入的數(shù)據(jù)的圖像男应,右鍵屬性
設(shè)置參數(shù)
然后返回Image闹司,右鍵refresh
激動(dòng)人心的時(shí)刻
運(yùn)行程序...觀察Sobel算子的結(jié)果
更改地址,設(shè)置為dstImg的地址
刷新顯示
鐺鐺鐺...
以上就是TI DSP C6657加載圖像沐飘,配置imglib庫游桩,圖像處理的完整過程。在后續(xù)耐朴,我講探索其他方式加載圖像借卧,喜歡的小伙伴請支持哦。