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<cuda::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,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(<PyObject*> _src,src_mat) src_gpu.upload(src_mat) cdef Mat src_mat_2 cdef GpuMat src_gpu_2 pyopencv_to(<PyObject*> _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,2) print("no problem so far") 当我试图编译它时,我得到一个错误,说’Ptr [DescriptorMatcher]’没有属性’knnMatch’. 现在据我所知,Ptr是DescriptorMatcher类型的共享指针,所以我从.pxd文件定义Ptr的方式肯定有问题. 我只是不知道如何解决它.如果有人能帮我解决,我将非常感激. 解决方法
我不认为你正确使用Ptr(它需要在Cython中解除引用才能进入knnMatch).
查看如何制作Ptr的好地方是Cython which wrap the similar classes 您不希望执行T element_type行,因为它不会被解释为typedef(就像在OpenCV标头中一样) – 它被解释为具有类型为T的element_type的成员(它不存在). 您可能想为Ptr设置一些其他构造函数.就目前而言,你只包装了默认的空单. (对于您的代码,它看起来并不重要,因为您从工厂函数中获取它). 最重要的是,您还需要设置解除引用运算符(运算符*).这可能只是你需要实现它才能工作: cdef cppclass Ptr[T]: Ptr() except + Ptr(Ptr*) except + T& operator* () # probably no exceptions 要使用它use the # at the top from cython.operator cimport dereference # later dereference(matcher).knnMatch(src_gpu,2) (我没有详细查看其余的代码,所以我没有评论它是否正确) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |