1.
HLS中持续出现:WARNING: Hls::stream 'hls::stream<ap_axiu<32, 1, 1, 1> >.1' is read while empty, which may result in RTL simulation hanging.
解决办法:这是因为输入的axi_src为空,因此需要把读进来的图片src_img转换成axi_src,需要加上IplImage2AXIvideo(src_img,axi_src);
另外有一种情况也能导致上述情况的发生。如:在IP核中有多个图像处理的步骤(以高斯滤波为例):
hls::GaussianBlur<5,5>(hsv_v,f1_v);
hls::GaussianBlur<5,5>(f1_v,f2_v);
hls::GaussianBlur<5,5>(f2_v,f3_v);
hls::CvtColor<HLS_GRAY2RGB>(f1_v,display_img);//这个地方有错,因为f1_v被第二层高斯滤波用掉了,因此f1_v就会变成空,这时候会报错。
改成如下格式就不会出错了:
hls::GaussianBlur<5,5>(hsv_v,f1_v);
hls::GaussianBlur<5,5>(f1_v,f2_v);
hls::GaussianBlur<5,5>(f2_v,f3_v);
hls::CvtColor<HLS_GRAY2RGB>(f3_v,display_img);//f3_v是没有被另外的模块调用,因此是正确的
如果想在HLS里多次引用变量,请使用hls::Duplicate(src,dst1,dst2);这个函数,能够复制两份变量。其中一个变量只能用一次。用法如下(注意注释)。原文链接:https://forums.xilinx.com/t5/High-Level-Synthesis-HLS/WARNING-Hls-stream-hls-stream-lt-unsigned-char-gt-1-is-read/m-p/1125807#M21260
hls::GaussianBlur<5,5>(hsv_v,f1_v);
hls::Duplicate(f1_v,dis_1,to_f2);//把f1_v复制了两份,一份用于显示(dis_1),另一份用于下一层高斯滤波(to_f2)
hls::CvtColor<HLS_GRAY2RGB>(dis_1,display_img1);//
hls::GaussianBlur<5,5>(to_f2,f2_v);
2.
IplImage转Mat类型。具体是深拷贝还是浅拷贝,这里我不太懂C++的语法,我只是会用。读取图片显示问题,cvShowImage显示IplImage类型的图片,而imshow显示Mat类型的图片。
//Loading image to IplImage
IplImage *img=cvLoadImage(“img_name.jpg”);
cvShowImage("Ipl",img);
//converting IplImage to cv::Mat
Mat image=cvarrToMat(img);
imshow("Mat",image);
3.
Mat类型转IplImage类型。显示各个类型的图片。
//Reading Image to cv::Mat
Mat image =imread(argv[1],1);
//Converting Mat to IplImage
IplImage test = image;
//showing image from mat
imshow("Mat",image);
//showing image from IplImage
cvShowImage("Ipl",&test);
4.IplImage和Mat类型的区别
IplImage:
在OpenCV中IplImage是表示一个图bai像的结构体,也是从OpenCV1.0到目du前最为重要的一个结构;在之前的dao图像表示用IplImage,而且之前的OpenCV是用C语言编写的,提供的接口也是C语言接口;
Mat:
Mat是后来OpenCV封装的一个C++类,用来表示一个图像,和IplImage表示基本一致,但是Mat还添加了一些图像函数;
mat和iplimage两者对于内存图像数据创建稍有不同:IplImage,通过cvCreateImage,创建后复制像素到创建的内存,或者cvCreateImageHeader和cvSetImageData创建;cv::Mat,直接可以通过构造函数Mat(int _rows, int _cols, int _type, void* _data, size_t _step=AUTO_STEP);直接创建。
5.cvSplit和cvMerge两个函数的用法:
dst是HSV图像,HSV三个通道分开显示:
cvSplit(dst,ch1,ch2,ch3,0);
cvMerge(ch1,NULL,NULL,NULL,ch_1);
cvShowImage("HH",ch_1);
cvReleaseImage(&ch_1);
cvMerge(NULL,ch2,NULL,NULL,ch_2);
cvShowImage("SS",ch_2);
cvReleaseImage(&ch_2);
cvShowImage("VV",ch3);
大概就是这么个意思吧。