2359|3

2015

帖子

0

TA的资源

纯净的硅(中级)

楼主
 

TI C6000 DSP上移植OpenCV [复制链接]

      EMCV全称为EmbeddedComputer Vision Library,是一个可在TI C6000系列DSP上运行的计算机视觉库。EMCV提供了跟OpenCV完全一致的函数接口,通过EMCV,你可以轻松的将你的OpenCV算法移植到DSP,甚至不用改一行代码。目前EMCV已经支持IplImage,CvMat,CvSeq等基本数据结构,可使用cvCreateImage等创建和释放图像,以及contour检测等。

1、在以建好的CCS工程中添加相关文件

①、下载EMCV源码,
②、分组添加源文件:将emcv源码复制到工程目录下。建立两个文件夹:src和include,将原OpenCV中的cv和cxcore的h文件全部拷贝到include文件中,将原OpenCV中cv和cxcore的cpp文件全部拷贝到src目录下。注:DSP上不需要HighGUI模块。
③、添加头文件和CPP文件到工程中。


2、修改EMCV源文件(也就是处理一些移植错误)
我总结一下错误  一共我遇到的有四处:

问题一、在cxmisc.h的第 233行  编译器对c语言标准的支持不同造成的。

出现这个错误 error: expression must have a constant value

CvSize cvGetMatSize(const CvMat* mat)
{
  CvSize size = {mat->width,mat->height}; 
  return size;
}

CV_INLINE  CvSize  cvGetMatSize( const CvMat* mat )

{

         CvSize size = cvSize( mat->cols, mat->rows );

    return size;

}

 CvMat在C语言中只定义了为rows和cols,采用rows和cols访问应该是最好的。
问题二、在cxtypes.h的第192行 

出现这个错误 error: expected an expression

CV_INLINE int cvFloor( double value )
{
 return int(floor(value));
}

CV_INLINE int cvFloor( double value )
{
   int a = floor(value);
   return a;
}

 问题三、在cxmisc.h中 line 219

函数名那块是 219行出现了个这样的错误error: expected a ")",

CV_INLINE void* cvAlignPtr( const void* ptr, int align=32)
{
assert( (align & (align-1)) == 0 );
return (void*)(((size_t)ptr + align - 1) & (~(size_t)(align-1)) );
}

CV_INLINE void* cvAlignPtr( const void* ptr, int align CV_DEFAULT(32))

{

    //assert( (align & (align-1)) == 0 );

    return (void*)( ((size_t)ptr + align - 1) & ~(size_t)(align-1) );

}

 

CV_INLINE int cvAlign( int size, int align )

{

   // assert( (align & (align-1)) == 0 && size < INT_MAX );

    return (size + align - 1) & -align;

}   //把那个 align 的缺省值删掉就正确了。

问题四、有些EMCV里会有重复定义的函数,去掉就OK

//typedef CvStatus (CV_STDCALL *CvFunc2DnC_1A1P)( void* arr, int step, CvSize size,

//                                                int cn, int coi, void* param );

 

//typedef CvStatus (CV_STDCALL *CvFunc2DnC_2A1P)( void* arr0, int step0,

//                                                void* arr1, int step1,

//                                                CvSize size, int cn,

//                                                int coi, void* param );

3、编写cmd文件
接下来需要编写cmd文件分配存储区域,考虑到EMCV函数很占用内存,所以将各个段都放在DDR2上面。另外,需要特别注意stack和heap的大小设置,如果设置得太小,程序在运行时空间不够很可能发生无法预料的结果,所以这里设置stack大小为0x00020000,heap大小为0x00800000,最终的linker.cmd文件

-heap                           0x00800000      /* Stack Size */

-stack                          0x00020000      /* Heap Size */

 

MEMORY

{

    VECS:       o = 0x00000000  l = 0x00000080

    IRAM:       o = 0x00000080  l = 0x00007f80  /*  32 kBytes */

    DRAM:       o = 0x00010000  l = 0x00008000  /*  32 kBytes */

  /*DDR2:       o = 0x80000000  l = 0x10000000*//* 256 MBytes */

    DDR2:       o = 0x80000000  l = 0x08000000  /* 128 MBytes */

}

 

SECTIONS

{

    .bss        >   DDR2

    .cinit      >   DDR2

    .cio        >   DDR2

    .const      >   DDR2

    .stack      >   DDR2

    .far        >   DDR2

    .switch     >   DDR2

    .tables     >   DDR2

    .sysmem     >   DDR2

    .text       >   DDR2

    .ddr2       >   DDR2

}

4、在CCS环境下编写测试程序
修改完EMCV源码之后,需要编写测试程序进行测试。这里编写的程序只完成几个很简单的任务:创建图像,在其中添加一个矩形框,释放图像。虽然程序很简单,但是它也包含了一部分OpenCV的基础数据结构,包括CvPoint,CvScalar,CvSize和IplImage,以及几个基本的函数,包括cvCreateImage,cvRectangle和cvReleaseImage。如果这些代码能够运行,那么表明EMCV移植到DSP上的工作初步完成了。最终的程序代码如下所示。
#include <stdio.h>

#include "cv.h"

int main()

{

         CvPoint point1, point2;

         point1.x = 0;

         point1.y = 0;

         point2.x = 10;

         point2.y = 10;

         CvScalar color = CV_RGB(0, 255, 0);

         CvSize size;

         size.height = 40;

         size.width = 40;

         IplImage* img;

         img = cvCreateImage(size, IPL_DEPTH_8U, 3);

         printf("%d %d %d\n", *(img->imageData), *(img->imageData + 1), *(img->imageData + 2));

         cvRectangle(img, point1, point2, color, CV_AA, 0,0);

         printf("%d %d %d\n", *(img->imageData), *(img->imageData + 1), *(img->imageData + 2));

         cvReleaseImage(&img);

         return 0;

}

 

5、测试结果分析
对于编写的测试程序可以在VS2010中进行测试,如果运行无误再移植到DSP。

将测试程序添加进工程,编译通过之后下载到开发板运行,最终输出结果如下所示。

其中第一行为创建图像的第一个像素点的BGR三个分量值,

第二行为将第一个像素点置为绿色之后的值,0 -1 0表示的是BGR(0, 255, 0),也即绿色,表明程序运行无误,EMCV在DSP上的移植取得初步成功。

最新回复

我是第一次接触DSP 能麻烦您帮忙稍微讲解一下吗?   详情 回复 发表于 2020-1-6 18:46
点赞 关注
 

回复
举报

3

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

您好  我也在做这个东西  遇到了一点问题  程序执行到cvCreateImage这一步就不往下执行 卡在那儿了  请问您遇到过吗?

点评

cvCreateImage情况不一定一样  详情 回复 发表于 2020-1-6 18:08
 
 

回复

2015

帖子

0

TA的资源

纯净的硅(中级)

板凳
 
xiaoxx 发表于 2020-1-6 16:51 您好  我也在做这个东西  遇到了一点问题  程序执行到cvCreateImage这一步就不往下执行 卡 ...

cvCreateImage情况不一定一样

 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

4
 
Aguilera 发表于 2020-1-6 18:08 cvCreateImage情况不一定一样

我是第一次接触DSP 能麻烦您帮忙稍微讲解一下吗?

 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

开源项目 更多>>
    查找数据手册?

    EEWorld Datasheet 技术支持

    相关文章 更多>>
    关闭
    站长推荐上一条 1/8 下一条

     
    EEWorld订阅号

     
    EEWorld服务号

     
    汽车开发圈

    About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

    站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

    北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

    电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
    快速回复 返回顶部 返回列表