使用OpenCV GPU旋转图像

3
我正在使用 OpenCV 库中的 gpu::rotate 函数将图像顺时针旋转。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/gpu/gpu.hpp>

int main()
{
    cv::Mat im_in = cv::imread( "test.png" );

    //upload image to GPU
    cv::gpu::GpuMat gpu_im ;

    gpu_im.upload( im_in ); // RAM => GPU

    //Rotate from 90
    cv::Size size = im_in.size();
    cv::gpu::GpuMat gpu_im_rot ;
    cv::gpu::rotate( gpu_im, gpu_im_rot, cv::Size( size.height, size.width ), -90, size.height-1, 0, cv::INTER_LINEAR  );

    gpu_im_rot.download(im_in); //GPU => RAM

    cv::imwrite( "out.png", im_in );

}

输入图像

enter image description here

输出图片

enter image description here

我一直有黑线,已经测试了多个偏移坐标和插值方法。
在opencv源码中的opencv\modules\gpu\src\imgproc.cpp中找不到真正对应的cuda代码。

为什么你的y坐标需要这样写:size.height-1,试试只用size.height。 - Scott Mudge
你确定黑线是因为旋转引起的吗? - zindarod
1
你的OpenCV版本似乎有一个bug。使用OpenCV 3.2.0可以正常工作。 - sgarizvi
如果我使用size.height,我会得到水平和垂直的黑线。 - themadmax
1个回答

1

我已经安装了opencv-3.4和cuda-10.0,并且在我的ubuntu-16.04系统上,以下代码可以正常工作。

#include <iostream>
#include <iomanip>
#include "opencv2/objdetect.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "opencv2/cudaobjdetect.hpp"
#include "opencv2/cudaimgproc.hpp"
#include "opencv2/cudawarping.hpp"
#include <opencv2/cudaarithm.hpp>
#include <stdio.h>

using namespace std;
using namespace cv;
using namespace cv::cuda;

int main()
{
    cv::Mat im_in = cv::imread( "test.png" );

    //upload image to GPU
    cv::cuda::GpuMat gpu_im ;

    gpu_im.upload( im_in ); // RAM => GPU

    //Rotate from 90
    cv::Size size = im_in.size();
    cv::cuda::GpuMat gpu_im_rot ;
    cv::cuda::rotate( gpu_im, gpu_im_rot, cv::Size( size.height, size.width ), -90, size.height-1, 0, cv::INTER_LINEAR  );

    gpu_im_rot.download(im_in); //GPU => RAM

    cv::imwrite( "out.png", im_in );

}

我在nvidia jetson nano上使用opencv-4.1.1(Cuda编译工具,版本10.0,V10.0.166)进行测试,但是size.height-1是必需的。 - themadmax
这对我不起作用。当我尝试时,它显示一张黑色的图像。有其他人尝试过这个解决方案吗? - cyrusbehr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接