当我编译这个例子时:
#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
有人知道为什么吗?
在当前版本的 OpenCV 中,cv::Mat
类没有重载赋值运算符或采用 cv::gpu::GpuMat
类型参数的复制构造函数。因此,以下代码行将无法编译。
cv::Mat result_host = dst;
这有两种选择。
首先,您可以将dst
作为 result_host
构造函数的参数传递。
cv::Mat result_host(dst);
二是可以调用dst
的download
函数
cv::Mat result_host;
dst.download(result_host);
似乎您应该使用download
gpuMat
方法将其转换为cv::Mat
:
//! downloads data from device to host memory. Blocking calls.
void download(cv::Mat& m) const;
请参阅此文档。