1. 背景知识

OPENCV(Open Source Computer Vision)被广泛的使用在计算机视觉开发上。使用 Vivado HLS 视频库在 zynq-7000 全可编程 soc 上加速 OPENCV 应用的开发,将大大提升我们的计算机视觉开发。

 

图 1 和图 2 展示了如何使用 opencv 加速 zynq-7000 全可编程 soc 的计算机视觉开发。

 

1> 使用 Vivado HLS 开发 opencv 的计算机视觉 IP;

 

2> 将 IP 添加到 SOC 系统中

 

3> 验证和下板实验

 

本次重点为 HLS 的图像读入显示,视频读入显示,以及摄像头的读入显示。

 

2. HLS 使用到的函数

 

enum

{

/* 8bit,color or not */

CV_LOAD_IMAGE_UNCHANGED =-1,// 读取图像的原通道数

/* 8bit,gray */

CV_LOAD_IMAGE_GRAYSCALE =0,// 读取灰度图片

/* ?,color */

CV_LOAD_IMAGE_COLOR =1,// 读取彩色图片

/* anydepth, ? */

CV_LOAD_IMAGE_ANYDEPTH =2,// 任意深度

/* ?,any color */

CV_LOAD_IMAGE_ANYCOLOR =4// 任意颜色

};

/* loadimage from file

iscolor can be a combination of aboveflags where CV_LOAD_IMAGE_UNCHANGED

overrides the other flags

using CV_LOAD_IMAGE_ANYCOLOR alone isequivalent to CV_LOAD_IMAGE_UNCHANGED

unless CV_LOAD_IMAGE_ANYDEPTH is specifiedimages are converted to 8bit

*/

CVAPI(IplImage*) cvLoadImage(constchar*filename, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR));

 

Filename 文件名

 

Iscolor 图像的颜色和深度

 

使用方法:

IplImage*src = cvLoadImage(filename,CV_LOAD_IMAGE_GRAYSCALE);

 

其他函数可以采用点击右键 open declaraTIon 查看。

 

Test.cpp 源码:

 

#include"Test.h"

#include"hls_opencv.h"

usingnamespace cv;

int main (int argc, char**argv) {

/*

// 方法 1 cvLoadImage 函数加载图片

IplImage* src =cvLoadImage(INPUT_IMAGE,CV_LOAD_IMAGE_GRAYSCALE);

IplImage* dst =cvCreateImage(cvGetSize(src), src->depth, src->nChannels);// 获取原始图像大小

AXI_STREAM src_axi, dst_axi;

IplImage2AXIvideo(src, src_axi);

AXIvideo2IplImage(src_axi, dst);

cvSaveImage(OUTPUT_IMAGE, dst);

cvShowImage( "result_1080p",dst);

cvReleaseImage(&src);

cvWaitKey();

*/

/*

// 方法 2 cvLoadImage 函数加载图片

Mat src_rgb = imread(INPUT_IMAGE,CV_LOAD_IMAGE_COLOR);// 加载图片并灰度显示

IplImage src = src_rgb;

cvSaveImage(OUTPUT_IMAGE, &src);

cvShowImage("src",&src);

waitKey(0);

return 0;

*/

/*

// 读取视频文件

IplImage *frame;

CvCapture *capture =cvCaptureFromAVI("1.avi");// 获取视频数据

cvNamedWindow("AVI player",0);

while(true)

{

if(cvGrabFrame(capture))

{

frame = cvRetrieveFrame(capture);

cvShowImage("AVI player",frame);

if(cvWaitKey(10)>=0) break;

}

else

{

break;

}

}

cvReleaseCapture(&capture);

cvDestroyWindow("AVI player");

return 0;

*/

// 摄像头操作

IplImage *frame;

CvCapture *capture = cvCaptureFromCAM(1);// 捕获摄像头数据 0-- 笔记本自带摄像头 1-- 外部摄像头

cvNamedWindow("AVIplayer",0);

while(true)

{

if(cvGrabFrame(capture))

{

frame = cvRetrieveFrame(capture);

cvShowImage("AVIplayer",frame);

if(cvWaitKey(10)>=0)break;

}

else

{

break;// 没有采集到视频数据退出

}

}

cvReleaseCapture(&capture);

cvDestroyWindow("AVIplayer");

return 0;

}

Test.h 源码:

#ifndef_TOP_H_

#define_TOP_H_

#include"hls_video.h"

//maximum image size

#defineMAX_WIDTH 1920

#defineMAX_HEIGHT 1080

// I/OImage SetTIngs

#defineINPUT_IMAGE "test_1080p.jpg"

#defineOUTPUT_IMAGE "result_1080p.bmp"

#defineOUTPUT_IMAGE_GOLDEN "result_1080p_golden.bmp"

//typedef video library core structures

typedef hls::stream> AXI_STREAM;

typedef hls::Scalar<3, unsignedchar> RGB_PIXEL;

typedef hls::Mat RGB_IMAGE;

#endif

 

3. VIVADO HLS 图像获取实验

对于工程的创建请参考《HLS 入门一》

实验原图 1

 

// 方法 1cvLoadImage 函数加载图片

IplImage* src = cvLoadImage(INPUT_IMAGE,CV_LOAD_IMAGE_GRAYSCALE);

实验结果 1

 

// 读取视频文件

IplImage *frame;

CvCapture *capture = cvCaptureFromAVI("1.avi");// 获取视频数据

cvNamedWindow("AVIplayer",0);