【问题标题】:Display Image from File using GPU (C++ / OpenCV)使用 GPU (C++ / OpenCV) 从文件中显示图像
【发布时间】:2015-10-14 13:43:16
【问题描述】:

我正在按照一个示例使用 GPU 来操作和显示来自 C++/OpenCV 文件的图像(来自这里:http://on-demand.gputechconf.com/gtc/2013/webinar/opencv-gtc-express-shalini-gupta.pdf)。代码是:

#include <opencv2/opencv.hpp>
#include <opencv2/gpu/gpu.hpp>
#include <opencv2/gpu/gpumat.hpp>
using namespace cv;
int main()
{
    Mat src = imread("car1080.jpg", 0);
    if (!src.data) exit(1);
    gpu::GpuMat d_src(src);
    gpu::GpuMat d_dst;
    gpu::bilateralFilter(d_src, gpu::Canny(d_dst, d_dst, 35, 200, 3);
    Mat dst(d_dst);
    imshow("out.png", dst);
    return 0;
}

但是,我不断收到一条错误消息,指出 gpu::GpuMat d_src(src)gpu::GpuMat d_dst 部分的 d_dst 未定义。根据我的阅读,这是因为我没有包含文件、声明或其他内容。

以下是我的附加依赖项列表:

opencv_calib3d249d.lib
opencv_contrib249d.lib
opencv_core249d.lib
opencv_features2d249d.lib
opencv_flann249d.lib
opencv_gpu249d.lib
opencv_highgui249d.lib
opencv_imgproc249d.lib
opencv_legacy249d.lib
opencv_ml249d.lib
opencv_nonfree249d.lib
opencv_objdetect249d.lib
opencv_photo249d.lib
opencv_stitching249d.lib
opencv_superres249d.lib
opencv_ts249d.lib
opencv_video249d.lib
opencv_videostab249d.lib

我对这一切都很陌生,所以我不确定我是否错过了额外的依赖项、标题或需要使用 Visual Studio 2012 安装/配置一些 GPU 组件。

任何帮助将不胜感激!谢谢!

更新:下面是我编译好的新代码;但是,即使将imwrite 行替换为imshow,也不会显示图像。 编辑我现在意识到我的代码在if (!src.data) exit(1); 行停止,大概是因为图像文件没有被正确读取?

#include <stdio.h>
#include <direct.h>
#include "fstream"
#include "iostream"
#include <vector>
#include "opencv2/core/core.hpp"
#include "opencv2/core/gpumat.hpp"
#include "opencv2/core/opengl_interop.hpp"
#include "opencv2/gpu/gpu.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"

int main(){
Mat src = imread("car.jpg", 0);
if (!src.data) exit(1);

gpu::GpuMat d_src(src);
gpu::GpuMat d_dst;

gpu::bilateralFilter(d_src, d_dst,15, 80,80);

Mat dst(d_dst);
imwrite("out.png", dst);
return 0;
}

注意 - 我可能不需要所有这些 #includes 但哦,好吧。

【问题讨论】:

  • 如果您想使用基于 GPU 的计算,您有 3 个选项 1) OpenCL (OCL) 或 2) 基于 Cuda 的 GPU 处理 3) 基于 OpenGL 的 GPU 处理。由于您使用的是 opencv 2.4.9 并且没有 OCL 或 Opengl 代码!我假设你正在使用 cuda。在这种情况下,您需要构建启用 cuda 的 opencv,并且需要包含那些 cuda 库和 dll!
  • 尝试在x64文件夹内链接库
  • 如何链接它? (请原谅我的无知——这对我来说是全新的)。感谢您的帮助!

标签: c++ opencv image-processing cuda gpu


【解决方案1】:

尝试包含 core.hpp。就我而言,它位于 opencv2/core/core.hpp

而且你必须修正你对双边过滤器(...) 和 Canny(...) 的函数调用。参数编号错误。

类似这样的:

int main(){
Mat src = imread("car.jpg", 0);
if (!src.data) exit(1);

gpu::GpuMat d_src(src);
gpu::GpuMat d_dst;

gpu::bilateralFilter(d_src, d_dst,15, 80,80);

Mat dst(d_dst);
imwrite("out.png", dst);
return 0;
}

你没有提到你的开发环境...(Win、Linux、Android、OpenCV 版本)。

我在 tegra 板上工作,所以对我来说情况可能会有些不同。我在我的开发环境中试用了这个示例。而且效果很好。

酷哈!

【讨论】:

  • 非常感谢您的帮助!我可能应该提到我正在使用 OpenCV 2.4.9 在 Visual Studio 2012 上的 Windows 中工作。不幸的是,我仍然收到链接错误,我认为这是因为我没有正确链接我的库?我是否需要安装任何额外的东西(我目前只安装了 VS2012 和 OpenCV)?
  • 就像 udit043 提到的,这听起来像是根据您的系统架构链接库的问题。如果存在 opencv 库路径,请检查环境变量 PATH(任务菜单 -> 系统 -> 高级系统设置链接 -> 在系统属性中的高级选项卡 -> 环境变量)。此外,如果您根据使用的 opencv 库选择了正确的系统架构,请检查您的构建属性。这个链接解释得很好:karanjthakkar.wordpress.com/2012/11/21/…
  • 使用这些指令,我现在可以毫无错误地编译我的代码 - 非常感谢!但是,现在当代码运行时,它不会显示任何图像。检查新代码的更新。
  • 当您的程序停止读取图像...这只是一个猜测,因为我没有系统来测试它,但您可能必须包含 imgcodecs.hpp 才能读取某些图像格式。
  • 我只是想显示一个 .jpg 文件,它可以通过 OpenCV 显示,而不需要 imgcodecs.hpp。我相信我的问题与设置 Visual Studio 以供 GPU 使用有关——我尝试使用 CMake,但遇到了很多问题。感谢您的帮助。
猜你喜欢
  • 2014-09-20
  • 1970-01-01
  • 2021-12-04
  • 2013-02-02
  • 2020-07-03
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 2013-10-31
相关资源
最近更新 更多