0 install
1 mkdir build
2 cd build
3 sudo cmake .. -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=../install -D ENABLE_FAST_MATH=1 -D WITH_OPENCL=ON -D WITH_IPP=OFF -D ITH_GTK=ON -D WITH_GTK3=ON -D BUILD_SHARED_LIBS=OFF -D CMAKE_C_COMPILER=/home/jeffrey/360/host/bin/aarch64-buildroot-linux-gnu-gcc -D CMAKE_CXX_COMPILER=/home/jeffrey/360/host/bin/aarch64-buildroot-linux-gnu-g++
after make install
opencv/opencv-4.7.0/install/lib
but run remap
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
using namespace cv;
void perspective_to_maps(cv::Matx33d &perspective_mat, cv::Size img_size, cv::Mat &map1, cv::Mat &map2)
{
cv::Mat inv_perspective(perspective_mat.inv());
inv_perspective.convertTo(inv_perspective, CV_32FC1);
cv::Mat xy(img_size, CV_32FC2);
float *pxy = (float *)xy.data;
for (int y = 0; y < img_size.height; y++)
for (int x = 0; x < img_size.width; x++)
{
*pxy++ = x;
*pxy++ = y;
}
// perspective transformation of the points
cv::Mat xy_transformed;
cv::perspectiveTransform(xy, xy_transformed, inv_perspective);
assert(xy_transformed.channels() == 2);
cv::Mat maps[2];
cv::split(xy_transformed, maps);
cv::convertMaps(maps[0], maps[1], map1, map2, CV_32F);
}
cv::Mat mapx,mapy,dst1,dst2;
cv::Matx33d homog(-1.104333310637919, -1.02803450593307, 4.132532927151,
-0.08141394964341982, -1.35103411932037, 4.2699610224884,
-0.0003145704784753452, -0.002810559414638452, 1);
int main(int argc, char **argv)
{
cv::Size size_map(6, 6);
perspective_to_maps(homog,size_map,mapx,mapy);
cv::Mat src = Mat::zeros(size_map,CV_8UC1); // cv::Mat src= cv::imread("../image/back.png",cv::IMREAD_GRAYSCALE);
for(int i = 0; i < src.cols;i++)
for (int j=0; j < src.cols; j++)
src.at<u_char>(i, j) = (i + j)*20;
cv::resize(src, src, size_map, 0, 0, cv::INTER_NEAREST);
cv::UMat usrc,udst1;
src.copyTo(usrc);
cv::remap(usrc, udst1, mapx, mapy, cv::INTER_LINEAR, cv::BORDER_CONSTANT, cv::Scalar(0));
std::cout<<"udst1:\n"<<dst1<<std::endl;
return 0;
}
arm_release_ver of this libmali is 'g6p0-01eac0', rk_so_ver is '6'.
[ WARN:0@0.216] global filesystem.cpp:489 getCacheDirectory Using world accessible cache directory. This may be not secure: /var/tmp/
OpenCL program build log: imgproc/remap
Status -11: CL_BUILD_PROGRAM_FAILURE
-D INTER_LINEAR -D BORDER_CONSTANT -D T=uchar -D rowsPerWI=1 -D WT=float -D convertToT=convert_uchar_sat_rte -D convertToWT=convert_float -D convertToWT2=convert_float2 -D WT2=float2 -D T=uchar -D T1=uchar -D cn=1 -D ST=uchar -D depth=0
<built-in>:175:9: error: expected member name or ';' after declaration specifiers
int32_t depth; /**< The image depth. */
~~~~~~~ ^
<built-in>:14:15: note: expanded from here
#define depth 0
^
<built-in>:175:8: error: expected ';' at end of declaration list
int32_t depth; /**< The image depth. */
^
error: Compiler frontend failed (error code 62)
how to resolve this change line 1356 depth to m_depth
1. OpenCV 测试
1. 验证OpenCV是否已启用GPU模块。
ocl::setUseOpenCL(true);
bool Is_have_opencl=ocl::haveOpenCL();
printf("Is_have_opencl:%d\n",Is_have_opencl);
2.上传待处理数据到GPU (Mat --> GpuMat)。
3.调用OpenCV支持的GPU的处理函数。
GaussianBlur(srcImage,dstImage,Size(23,23),0,0);
4.下载处理结果到CPU (GpuMat ---> Mat)。
2. Test and Result
cpu
在这里插入图片描述
gpu
3.Code
#include <opencv2/core/ocl.hpp>
#include <opencv2/opencv.hpp>
// #include "opencv2/highgui.hpp"
#include<stdio.h>
#include<time.h>
#include<unistd.h>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc,char **argv)
{
cv::UMat srcImage(3840, 2160, CV_8UC3, Scalar(0, 0, 255));
cv::UMat dstImage;
ocl::setUseOpenCL(true);
bool Is_have_opencl=ocl::haveOpenCL();
printf("Is_have_opencl:%d\n",Is_have_opencl);
double time_total=0;
double time_ave=0;
double time_cost=0;
int loop_times=10;
if(2 > argc)
printf("Error./test_opencv_gpu 1.jpg 10");
else{
std::string loop_no=argv[1];
loop_times=stoi(loop_no);}
int start= 0,endl=0;
//dstImage.copyTo(udstImage);
while(true)
{
GaussianBlur(srcImage,dstImage,Size(23,23),0,0);
}
}
4 .conclusion
1.Umat can releave CPU’s load.
2.Umat accelate is not obvious.
5.Reference
RK3399 测试—提速没有TX2 明显
原文链接
只需要把Mat 变量重新定义为UMat 即可调用OpenCV 的GPU
PC 测试 —内存管理部分和数据转换部分对于GPU模块而言消耗了大量的时间
封装到里面
OpenCV