编译错误 cv::gpu

Compiling error cv::gpu

本文关键字:gpu cv 错误 编译      更新时间:2023-10-16

我在 Ubuntu 12.04 上使用 OpenCV master 分支 (3.0.0. dev) 和 CUDA,并尝试使用 GPU 代码编译以下 opencv:

#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/gpu/gpu.hpp"
using namespace cv;
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;
}

编译命令为:

g++ testgpu.cpp -o test `pkg-config --cflags --libs opencv` -lopencv_gpu

它具有以下编译错误:

testgpu.cpp: In function ‘int main(int, char**)’:
testgpu.cpp:13:51: error: ‘CV_LOAD_IMAGE_GRAYSCALE’ was not declared in this scope
         cv::Mat src_host = cv::imread("file.png", CV_LOAD_IMAGE_GRAYSCALE);
                                                   ^
testgpu.cpp:17:52: error: ‘CV_THRESH_BINARY’ was not declared in this scope
         cv::gpu::threshold(src, dst, 128.0, 255.0, CV_THRESH_BINARY);
                                                    ^
testgpu.cpp:19:31: error: conversion from ‘cv::gpu::GpuMat’ to non-scalar type ‘cv::Mat’ requested
         cv::Mat result_host = dst;
                           ^

OpenCV的安装有问题,还是Opencv 3.0.0中的API更改?

gpu模块在OpenCV 3.0中重新设计。它被拆分为几个模块,它被重命名为cuda gpu::命名空间被重命名为cuda:: 。OpenCV 3.0的正确代码:

#include <iostream>
#include "opencv2/opencv.hpp"
#include "opencv2/core.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/cudaarithm.hpp"
using namespace cv;
int main (int argc, char* argv[])
{
    try
    {
        cv::Mat src_host = cv::imread("file.png", cv::IMREAD_GRAYSCALE);
        cv::cuda::GpuMat dst, src;
        src.upload(src_host);
        cv::cuda::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;
}

啊,他们一直在玩 master 中的常量。预计几乎可以在任何地方删除CV_*前缀(除了类型,CV_8U等仍然有效)。

所以cv::THRESH_BINARYcv::LOAD_IMAGE_GRAYSCALE,但是.... cv::COLOR_BGR2GRAY(你现在没有使用它,但我就省你搜索;))

抱歉,我没有 GPU 方面的经验,所以我无法解决那里的最后一个谜语。