python opencv调用cuda_c – 使用python中的Opencv Cuda函数

对于我的一个课程项目,我需要使用OpenCVs GPU库.我正在使用OpenCV

python的现有代码,我的工作是找到一种方法来访问OpenCV Cuda库,因为现在没有可访问的

Python绑定到OpenCV的各种CUDA模块.

我现在非常需要的两个函数是cuda :: warpPerspective和cv :: cuda :: DescriptorMatcher :: knnMatch().

我试图按照@ostrumvulpes在Accessing OpenCV CUDA Functions from Python (No PyCUDA)中提出的建议来实现warpPerspective并且它工作正常.现在我被困在DescriptorMatcher :: knnMatch()中.更确切地说,我需要使用蛮力描述符匹配器knnmatch函数(CUDA).我在网上搜索了用C编写的例子,这样我就可以初步了解如何通过cython将其转换为使其工作.

我发现的大多数例子如下:

Ptr<:descriptormatcher> matcher =

cuda::DescriptorMatcher::createBFMatcher();

vector< vector< DMatch> > matches;

matcher->knnMatch(descriptors_object_Gpu, descriptors_scene_Gpu, matches, 2);

为了实现这三行,我首先在.pxd文件中添加了我认为必要的内容.我的pxd文件如下所示:

GpuWrapper.pxd

from libcpp cimport bool

from cpython.ref cimport PyObject

from libcpp.vector cimport vector

# References PyObject to OpenCV object conversion code borrowed from OpenCV's own conversion file, cv2.cpp

cdef extern from 'pyopencv_converter.cpp':

#mrc689 April 20,2017

void import_array()

cdef PyObject* pyopencv_from(const Mat& m)

cdef bool pyopencv_to(PyObject* o, Mat& m)

cdef extern from 'opencv2/imgproc.hpp' namespace 'cv':

cdef enum InterpolationFlags:

INTER_NEAREST = 0

cdef enum ColorConversionCodes:

COLOR_BGR2GRAY

cdef extern from 'opencv2/core/core.hpp':

cdef int CV_8UC1

cdef int CV_32FC1

cdef extern from 'opencv2/core/core.hpp' namespace 'cv':

cdef cppclass Size_[T]:

Size_() except +

Size_(T width, T height) except +

T width

T height

ctypedef Size_[int] Size2i

ctypedef Size2i Size

cdef cppclass Scalar[T]:

Scalar() except +

Scalar(T v0) except +

cdef extern from 'opencv2/core/core.hpp' namespace 'cv':

cdef cppclass Mat:

Mat() except +

void create(int, int, int) except +

void* data

int rows

int cols

#added to test the Algorithm class inside core.hpp on May5th 12.52 AM.

cdef cppclass Algorithm:

Algorithm() except +

cdef extern from 'opencv2/core/base.hpp' namespace 'cv':

cdef enum NormTypes:

NORM_INF= 1,

NORM_L1= 2,

NORM_L2= 4,

NORM_HAMMING= 6,

NORM_HAMMING2= 7,

cdef extern from 'opencv2/core/cuda.hpp' namespace 'cv::cuda':

cdef cppclass GpuMat:

GpuMat() except +

void upload(Mat arr) except +

void download(Mat dst) const

cdef cppclass Stream:

Stream() except +

cdef extern from 'opencv2/core/types.hpp' namespace 'cv':

cdef cppclass DMatch:

DMatch() except +

float distance

int imgIdx

int queryIdx

int trainIdx

cdef extern from 'opencv2/core/cvstd.hpp' namespace 'cv':

cdef cppclass Ptr[T]:

T element_type

Ptr() except +

cdef extern from 'opencv2/cudafeatures2d.hpp' namespace 'cv::cuda':

cdef cppclass DescriptorMatcher:

@staticmethod

Ptr[DescriptorMatcher] createBFMatcher(int normType) except+

#Expected to see error here

void knnMatch(GpuMat queryDescriptors, GpuMat trainDescriptors, vector[vector[DMatch]] &matches,int k)

cdef extern from 'opencv2/cudawarping.hpp' namespace 'cv::cuda':

cdef void warpPerspective(GpuMat src, GpuMat dst, Mat M, Size dsize, int flags, int borderMode, Scalar borderValue, Stream& stream)

# Function using default values

cdef void warpPerspective(GpuMat src, GpuMat dst, Mat M, Size dsize, int flags)

我的pyx看起来像这样:

GpuWrapper.pyx

import numpy as np # Import Python functions, attributes, submodules of numpy

cimport numpy as np # Import numpy C/C++ API

def match_feature(np.ndarray[np.float32_t, ndim=3] _src,

np.ndarray[np.float32_t, ndim=2] _M):

np.import_array()

# Create GPU/device InputArray for src

cdef Mat src_mat

cdef GpuMat src_gpu

pyopencv_to( _src, src_mat)

src_gpu.upload(src_mat)

cdef Mat src_mat_2

cdef GpuMat src_gpu_2

pyopencv_to( _M, src_mat_2)

src_gpu_2.upload(src_mat_2)

cdef Ptr[DescriptorMatcher] matcher= Ptr()

matcher = DescriptorMatcher.createBFMatcher(4)

cdef vector[vector[DMatch]] matches

matcher.knnMatch(src_gpu,src_gpu_2,matches,2)

print("no problem so far")

当我试图编译它时,我得到一个错误,说’Ptr [DescriptorMatcher]’没有属性’knnMatch’.

现在据我所知,Ptr是DescriptorMatcher类型的共享指针,所以我从.pxd文件定义Ptr的方式肯定有问题.

我只是不知道如何解决它.如果有人能帮我解决,我将非常感激.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值