opencv cuda使用笔记

目录

cuda拷贝

cuda+opencv yolov4

颜色转换:

cv::cuda::split

查看10*10像素

down_load用法


特别全的学习资料:

我想将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()&lt;&lt;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间拷贝:

https://github.com/LiPorkLi/BatteryFilmCheck/blob/c048163ac0d10cb7db2e7506b7e0c8d8f8a96a20/ProtoParams/Alogrithm/BoudarySearch.cpp

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);

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI算法网奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值