【问题标题】:OpenCV | Mat to gpuMat Exception at memory location?开放式简历 |内存位置的 Mat 到 gpuMat 异常?
【发布时间】:2013-12-02 02:45:17
【问题描述】:

我在尝试从 cv::Mat 转换为 gpu::Mat 时遇到问题。我正在使用 VS2012 Win7 x64。

这是代码:

#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/opencv.hpp>
#include "opencv2/highgui/highgui.hpp"
#include <opencv2\gpu\gpu.hpp>
#include "cv.h"
#include "cxcore.h"
#include <stdarg.h>
#include <stdlib.h>
#include <stdio.h>
#include <iostream>

using namespace cv;
using namespace cv::gpu;

int main () {

Mat src = cv::imread("pic1.jpg");
gpu::GpuMat d_src, d_dst;

d_src.upload(src);

gpu::bilateralFilter(d_src,d_dst, -1, 50, 7 );
gpu::Canny(d_dst, d_dst, 35, 200, 3);

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

我使用了很多包含,因为在同一个文件中我声明了其他函数。

这是我包含的 lib 文件:

opencv_core246d.lib
opencv_imgproc246d.lib
opencv_highgui246d.lib
opencv_ml246d.lib
opencv_video246d.lib
opencv_features2d246d.lib
opencv_calib3d246d.lib
opencv_objdetect246d.lib
opencv_contrib246d.lib
opencv_legacy246d.lib
opencv_flann246d.lib
opencv_nonfree246d.lib
opencv_photo246d.lib
opencv_stitching246d.lib
opencv_superres246d.lib
opencv_ts246d.lib

这是我尝试编译时得到的结果

First-chance exception at 0x000007FEFDD29E5D in CVtest.exe: Microsoft C++ exception:      cv::Exception at memory location 0x000000000025F8D0.
First-chance exception at 0x000007FEFDD29E5D in CVtest.exe: Microsoft C++ exception: cv::Exception at memory location 0x000000000025F8D0.
Unhandled exception at at 0x000007FEFDD29E5D in CVtest.exe: Microsoft C++ exception: cv::Exception at memory location 0x000000000025F8D0.
The program '[6592] CVtest.exe' has exited with code -1073741510 (0xc000013a).

每当我尝试在 Mat 和 gpuMat 之间切换时它都会显示。

我该如何解决这个问题?

【问题讨论】:

  • 我在您的代码中看到的第一个错误是您使用下载方法而不是上传方法来将图像从cpu内存复制到设备内存
  • 是的,你是对的,我忘了更改它。无论如何上传和下载都会导致同样的错误。

标签: c++ opencv gpu


【解决方案1】:

在我的 Windows 计算机上使用带有 VS2010 的 OpenCV 上的 GPU 模块上传/下载时,我遇到了同样的问题。我使用的是可以在 OpenCV 网站上下载的预编译 2.4.6 二进制文件。

您需要确保您的卡上启用了 CUDA+OpenGL(假设您有一个启用了 CUDA 的 GPU)。您需要做的第一件事是运行(或仅使用 C 的等效项):

cout << cv::getBuildInformation() << endl;

这将告诉您在 OpenCV 构建中启用或未启用的内容。它会打印很多信息,但会查找打印“其他第三方库”的位置:

Other third-party libraries:
    Use IPP:                     NO
    Use Eigen:                   NO
    Use TBB:                     NO
    Use OpenMP:                  NO
    Use GCD                      NO
    Use Concurrency              YES
    Use C=:                      NO
    Use Cuda:                    NO
    Use OpenCL:                  NO

如果 Use Cuda 和/或 Use OpenCL 都拒绝,那么每当您调用 GPU 函数(如上传和下载)时,您的程序就会崩溃。

要解决这个问题,您需要在启用这些技术的情况下编译 OpenCV。对于 Windows,我遵循了本指南:

http://www.programmerfish.com/how-to-build-opencv-2-4-6-with-gpu-module-in-windows/#.UpuDQcRLNBm

在使用 OpenGL 和 CUDA 支持编译 2.4.7 版本后,一切对我来说都完美无缺。

【讨论】:

    猜你喜欢
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2012-06-12
    • 2011-10-20
    • 2016-01-23
    • 1970-01-01
    相关资源
    最近更新 更多