gpumat和mat出错

时间:2013-01-22 21:18:43

标签: c++ opencv

当我编译这个例子时:

#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

有人知道为什么吗?

2 个答案:

答案 0 :(得分:4)

在当前版本的OpenCV中,cv::Mat类没有重载赋值运算符或复制构造函数,它接受类型为cv::gpu::GpuMat的参数。因此,代码的以下行将无法编译。

cv::Mat result_host = dst;

有两种替代方案。

首先,您可以将dst作为result_host的构造函数的参数传递。

cv::Mat result_host(dst);

其次,您可以调用download

dst功能
cv::Mat result_host;
dst.download(result_host);

答案 1 :(得分:2)

您似乎应该使用download gpuMat方法将其转换为cv::Mat

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

请参阅this doc