0

我尝试将自己的内核实现为中值滤波器,如下所示:

//main.cpp
#include "opencv2/opencv.hpp"
cv::Mat inputMat = cv::imread()
cudaMedianCaller (inputMat, kernelMat)

//medianFilter.h
#include "opencv2/opencv.hpp"
cudaMedianCaller (const cv::Mat& inputMat, cv::Mat& kernelMat);

//medianFilter.cu
cudaMedianCaller (const cv::Mat& inputMat, cv::Mat& kernelMat)
{
    kernelMedianFilter<<< , >>> (uchar3* d_inputMat, uchar* d_kernelMat)
}

__global__ void kernelMedianFilter (uchar3* d_inputMat, uchar* d_kernelMat)
{

}

我得到编译错误:

C1083:无法打开包含文件:'opencv2/opencv.hpp':没有这样的文件或目录

我知道 .cu 文件使用 nvcc 编译并且无法编译 OpenCV 头文件。

1) 如何将 OpenCV3.1.0 库包含到 .cu 文件中?

4

2 回答 2

2

您不需要在 .cu 文件中包含 OpenCV。您需要一个以原始指针和基本数据类型作为参数的调用者 API。

主文件

#include "opencv2/opencv.hpp"
#include "medianFilter.h"

int main() {
  cv::Mat inputMat = cv::imread();
  .....
  cudaMedianCaller (d_inputMat, d_kernelMat);
  .....
  return 0;
}

中值过滤器.h

cudaMedianCaller (uchar3* d_inputMat, uchar* d_kernelMat);

中值过滤器.cu

cudaMedianCaller (uchar3* d_inputMat, uchar* d_kernelMat)
{
    kernelMedianFilter<<< , >>> (uchar3* d_inputMat, uchar* d_kernelMat)
}

__global__ void kernelMedianFilter (uchar3* d_inputMat, uchar* _kernelMat)
{

}
于 2016-07-04T13:34:08.990 回答
0

尽管另一个很好的答案建议将 C++ 和 CUDA 分开,但还有另一种方法可以将 OpenCV 容器包含在.cu文件中:

CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
project(test LANGUAGES CXX CUDA)
find_package(OpenCV 3.0 REQUIRED)

# compile the target
add_executable(test_app main.cpp medianFilter.cu)
target_link_libraries(test_app PRIVATE cudart ${OpenCV_LIBS})

主文件

#include "opencv2/opencv.hpp"
#include "medianFilter.h"

int main()
{
    // input data
    cv::Mat inputMat(cv::Size(128, 128), CV_8UC3, cv::Scalar(100));
    cv::Mat kernelMat(cv::Size(16, 16), CV_8UC1, cv::Scalar(1));

    // call CUDA
    cudaMedianCaller(inputMat, kernelMat);
    return 0;
}

中值过滤器.cu

#include "medianFilter.h"
__global__ void kernelMedianFilter(uchar3* d_inputMat, uchar* d_kernelMat)
{
    return;
}
void cudaMedianCaller(const cv::Mat& inputMat, cv::Mat& kernelMat)
{
    // allocate device pointers
    uchar3 *d_inputMat;
    uchar  *d_kernelMat;
    cudaMalloc(&d_inputMat,  inputMat.total() * sizeof(uchar3));
    cudaMalloc(&d_kernelMat, kernelMat.total() * sizeof(uchar));

    // copy from host to device
    cudaMemcpy(d_inputMat, inputMat.ptr<uchar3>(0), inputMat.total() * sizeof(uchar3), cudaMemcpyHostToDevice);
    cudaMemcpy(d_kernelMat, kernelMat.ptr<uchar>(0), kernelMat.total() * sizeof(uchar), cudaMemcpyHostToDevice);

    // call CUDA kernel
    kernelMedianFilter <<<1, 1>>> (d_inputMat, d_kernelMat);

    // free
    cudaFree(d_inputMat);
    cudaFree(d_kernelMat);
}

中值过滤器.h

#include "opencv2/opencv.hpp"
void cudaMedianCaller (const cv::Mat& inputMat, cv::Mat& kernelMat);

要运行二进制应用程序,您可能需要将一些必需的文件复制.dll到二进制文件夹中。对我来说,我opencv_core343.dll从存在C:\Program Files\OpenCV\x64\vc15\bin的文件夹中复制test_app.exe

于 2018-10-22T12:23:51.650 回答