2013-01-22 57 views
5

當我編譯這個例子:誤差gpumat和墊

#include <iostream> 
#include "opencv2/opencv.hpp" 
#include "opencv2/gpu/gpu.hpp" 

int main (int argc, char* argv[]) 

{ 
    try 
    { 
     cv::Mat src_host = cv::imread("file.png", CV_LOAD_IMAGE_GRAYSCALE); 
     cv::gpu::GpuMat dst, src; 
     src.upload(src_host); 

     cv::gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY); 

     cv::Mat result_host = dst; 
     cv::imshow("Result", result_host); 
     cv::waitKey(); 
    } 
    catch(const cv::Exception& ex) 
    { 
     std::cout << "Error: " << ex.what() << std::endl; 
    } 
    return 0; 
} 

我得到了以下錯誤:

threshold.cpp: In function ‘int main(int, char**)’: 
threshold.cpp:19: error: conversion from ‘cv::gpu::GpuMat’ to non-scalar type ‘cv::Mat’ requested 

有誰知道這是爲什麼?

回答

3

在當前版本的OpenCV中,cv::Mat類沒有重載的賦值運算符或複製構造函數,它使用類型爲cv::gpu::GpuMat的參數。所以你的代碼的下面一行不會被編譯。

cv::Mat result_host = dst; 

還有2種替代方法。

首先,您可以傳遞dst作爲result_host構造函數的參數。

cv::Mat result_host(dst); 

二是,你可以調用dst

cv::Mat result_host; 
dst.download(result_host); 
+0

感謝您的答覆。 現在執行這個文件,下面的錯誤時: /// OpenCV的錯誤:未知的錯誤代碼-216(該庫不支持CUDA編譯)在複製,文件/home/cbib/Descargas/OpenCV-2.4。 3/modules/core/src/gpumat.cpp,line 736 ///// 你知道會發生什麼嗎? –

+0

@ChitoWebster ...這是因爲您正在使用未經CUDA支持編譯的OpenCV二進制文件。檢查[這個答案](http://stackoverflow.com/questions/13228762/opencv-2-4-3rc-and-cuda-4-2-opencv-error-no-gpu-support/13231205#13231205)其中同樣的問題已經解決。 – sgarizvi

2

看來你應該使用的gpuMatdownload方法將其轉換爲cv::Mat

//! downloads data from device to host memory. Blocking calls. 
     void download(cv::Mat& m) const; 

this doc

+1

download功能@ChitoWebster我的回答竟是也是正確的(你可以嘗試+1吧)。關於您的新錯誤閱讀這裏:http://stackoverflow.com/questions/12910902/opencv-error-no-gpu-support-library-is-compiled-without-cuda-support – ArtemStorozhuk