2013-01-22 14 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 

は、誰もがなぜ知っていますか?

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

this docを参照してください:

答えて

3

現在のバージョンのOpenCVでは、cv::Matクラスには、オーバーロードされた代入演算子またはコピーコンストラクタがありません。このコンストラクタには、型がcv::gpu::GpuMatの引数をとります。したがって、次のコード行はコンパイルされません。

cv::Mat result_host = dst; 

これには2つの選択肢があります。

まず、dstをコンストラクタの引数としてresult_hostに渡すことができます。

cv::Mat result_host(dst); 

第二には、あなたが私の答えは(あなたが+1にそれを試すことができます)また、実際には正しかった@ChitoWebster 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、行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

あなたがcv::Matに変換するgpuMatdownload方法を使用すべきであると思われます。

+1

download関数を呼び出すことができるということです。新しいエラーについてはこちらをご覧ください:http://stackoverflow.com/questions/12910902/opencv-error-no-gpu-support-library-is-compiled-without-cuda-support – ArtemStorozhuk

関連する問題