ViVADO HLS 影像的獲取

  • 2019 年 10 月 29 日
  • 筆記

ViVADO HLS 影像的獲取

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<ap_axiu<32,1,1,1>> AXI_STREAM;

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

typedef hls::Mat<MAX_HEIGHT,MAX_WIDTH, HLS_8UC3> 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);

實驗結果影片展示:

影片內容