目录
特别全的学习资料:
我想将OpenCV::cuda::GpuMat类型的数据给TensorRT GPU加速,请问有方法吗? - 知乎
cuda拷贝
cv::Mat image = cv::imread("C:\\RegressionModelImages\\cat.png", cv::IMREAD_COLOR);
cv::cvtColor(image, image, cv::COLOR_BGR2RGB);
This can be converted to a GpuMat if necessary:
cv::cuda::GpuMat gpu_image(image.size(), image.type());
cv::Mat frame_cpu;
cv::cuda::GpuMat d_frame_gpu;
cv::Mat down_img;
double t = (double)cv::getTickCount();
frame_cpu=cv::imread("/home/tao/useful/faceboxes_tensorrt_cuda/cuda_opencv/test.jpg");
cvtColor(frame_cpu,frame_cpu,CV_RGB2BGRA);
frame_cpu.convertTo(frame_cpu, CV_32FC4,4);
std::cout<<frame_cpu.channels()<<std::endl;
d_frame_gpu.upload(frame_cpu);
frame_pad(d_frame_gpu,d_frame_gpu);
cv::cuda::resize(d_frame_gpu,d_frame_gpu,cv::Size(1024,1024));
size_t inputWidth=1024;
size_t inputHeight=1024;
size_t outputWidth=1024;
size_t outputHeight=1024;
float* output;
float* output_host;
cudaMalloc((void**)&output,sizeof(float)*inputWidth*inputWidth*3);
cudaPreImageNet((float4*)d_frame_gpu.pt<float4>(), inputWidth, inputHeight,output, outputWidth, outputHeight);
cudaMemcpy(output_host,output,sizeof(float)*inputWidth*inputWidth*3,cudaMemcpyDeviceToHost);
使用OpenCV操作CUDA送检图像到TensorRT(SSD模型)_ikevin的专栏-CSDN博客
cuda+opencv yolov4
使用CUDA+OpenCV加速yolo v4性能_深度学习与计算机视觉-CSDN博客
颜色转换:
cv::cuda::resize(gpu_frame, gpu_frame, Size(960, 540), 0, 0, INTER_LINEAR);
// convert to gray
cv::cuda::GpuMat gpu_current;
cv::cuda::cvtColor(gpu_frame, gpu_current, COLOR_BGR2GRAY);
cv::cuda::split
cv::cuda::split 使用_jacke121的专栏-CSDN博客
cv::Mat image = cv::imread(imgpath + filelist[i]);
//std::cout << "image:" << filelist[i] << std::endl;
if (image.empty()) {
std::cout << "读入图片为空,请检查路径!" << std::endl;
system("pause");
return -1;
}
/* cv::Mat image;
cv::cvtColor(image_o, image, cv::COLOR_BGR2RGB);*/
DWORD start2 = GetTickCount();
cv::cuda::GpuMat imageGpu(image.cols, image.rows, CV_8UC3, cv::Scalar(0, 0, 0));
//cv::cuda::GpuMat imageGpu;// (cv::Size(image.cols, image.rows), CV_8UC3);
cv::cuda::GpuMat imageRGB(image.cols, image.rows, CV_32FC3, cv::Scalar(0, 0, 0));
imageGpu.upload(image);
imageGpu.convertTo(imageRGB, CV_32FC3, 1,0);
转cpu:
cv::Mat dst;
flt_image_out.download(dst);
cv::Mat dst_gold;
cv::cvtColor(src, dst_gold, cv::COLOR_BGR2RGB);
查看10*10像素
区别:一个3b,一个3f。
cv::Mat raw_image = cv::imread(image_name.c_str());
for (int i = 0; i <10; i++)
{
for (int j = 0; j <10; j++)
{
std::cout << "(" <<
(float)raw_image.at<cv::Vec3b>(i, j)[0]<< ", " <<
(float)raw_image.at<cv::Vec3b>(i, j)[1]<< ", " <<
(float)raw_image.at<cv::Vec3b>(i, j)[2]<< ") " << std::endl;
std::cout << "(" <<
(float)raw_image.at<cv::Vec3f>(i, j)[0] << ", " <<
(float)raw_image.at<cv::Vec3f>(i, j)[1] << ", " <<
(float)raw_image.at<cv::Vec3f>(i, j)[2] << ") " << std::endl;
}
}
查看全部像素:
void showMat(cv::Mat &img){
std::cout << "图像元素查看 : " << img.rows<<"," << img.cols <<std::endl;
for (int i = 0; i<img.rows; i++)
{
for (int j = 0; j < img.cols; j++)
{
std::cout<< "("<<
(float)img.at<cv::Vec3f>(i, j)[0]<< ", " <<
(float)img.at<cv::Vec3f>(i, j)[1]<< ", " <<
(float)img.at<cv::Vec3f>(i, j)[2]<< ") " << std::endl;
//(int)img.at<cv::Vec3b>(i, j)[0]<< ", " <<
//(int)img.at<cv::Vec3b>(i, j)[1]<< ", " <<
//(int)img.at<cv::Vec3b>(i, j)[2]<< ") " << std::endl;
}
}
}
}
cuda方式操作:
OpenCV+CUDA 遍历cv::Mat笔记_YaoJiawei329的博客-CSDN博客
down_load用法
比较慢
DWORD start2 = GetTickCount();
cv::cuda::GpuMat imageGpu(cv::Size(image.cols, image.rows), CV_8UC3);
cv::cuda::GpuMat imageRGB;
imageGpu.upload(image);
imageGpu.convertTo(imageRGB, CV_32FC3, 1,0);
//std::cout << "dst:" << errMsg << std::endl;
cv::Mat dst;
imageRGB.download(dst);
DWORD end2 = GetTickCount();
std::cout << "gpu img time:" << end2 - start2 << "ms " << image.cols << " " << image.rows << std::endl;
gpu间拷贝:
cudaMemcpy(SrcDstImg->data + iStep + iS, SrcDstImg->data + iStep + m_vecvecBoundary[i][j].first, sizeof(uchar)*iLength, cudaMemcpyDeviceToDevice);
//memcpy(SrcDstImg->data + iStep + iS, SrcDstImg->data + iStep + m_vecvecBoundary[i][j].first, sizeof(uchar)*iLength);
iE = m_vecvecBoundary[i][j].second + iLength;
if (iE > SrcDstImg->cols)
{
iE = SrcDstImg->cols - 1;
iLength = iE - m_vecvecBoundary[i][j].second + 1;
}
cudaMemcpy(SrcDstImg->data + iStep + m_vecvecBoundary[i][j].second, SrcDstImg->data + iStep + (m_vecvecBoundary[i][j].second - iLength), sizeof(uchar)*iLength, cudaMemcpyDeviceToDevice);
reshape:
reshape完毕后还是二维向量,无法变成一维向量。
cv::cuda:GPUMat input;
cv::cuda:GPUMat input3;
input3 = input.reshape(1,1);