DSPC6657读取图片数据并进行图像处理

DSP芯片中没有文件系统,不能像PC那样直接用imread或open file等操作直接读取图片,需要将图片转为.dat文件注入DSP芯片的存储器中,再进行处理操作。

  1. 准备一张图像,我采用lean.jpg, 512*512,单通道灰度图像。

在这里插入图片描述

  1. 打开C++ IDE,编写C++代码,将图像数据保存到为DSP可以加载的.dat文件。

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));
            fprintf(fp, "%d\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文件第一行添加如下内容:

在这里插入图片描述
在这里插入图片描述
这里的最后一个数字“10”不知道是什么意思。在测试的时候按照原方法导入图片时出现下图所示的问题,对比内存数值发现于dat文件里的数值对不上,于是将代上面jpg转dat代码中的%x改为%d十进制,导入DSP之后正常,于是猜想最后一个数字表示十进制的??

在这里插入图片描述

  1. 打开CCS8.1,配置环境。
    新建一个CCS工程
    在这里插入图片描述

工程设置(如果要使用DDR3,需要加载gel文件)
.gel文件用于初始化DSP的参数,比如PLL锁相环,DDR3初始化。
在这里插入图片描述

配置imagelib库
在这里插入图片描述
其实与vs2017配置opencv相似,需要将imagelib库的.h,.lib(实际是.ae66)静态库加载到工程的搜索路径。

将.h文件加载到complier搜索路径。(点击工程,右键属性)

在这里插入图片描述
将.lib/.ae66加载到linker链接器的路径。

在这里插入图片描述

若路径正确,工程将出现以下内容:
在这里插入图片描述

  1. 编写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);
}
  1. 编译运行,观察结果
    连接上仿真器
    在这里插入图片描述
    将之前生成的.dat文件导入内存
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    数据导入成功

在这里插入图片描述
观察导入的数据的图像,右键属性
在这里插入图片描述
设置参数

在这里插入图片描述
然后返回Image,右键refresh

在这里插入图片描述
运行程序…观察Sobel算子的结果

更改地址,设置为dstImg的地址

在这里插入图片描述
刷新显示

在这里插入图片描述

  • 0
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值