我正在尝试为一些使用OpenCV的C++代码编写一个python包装器,但是我很难将结果(一个OpenCV C++ Mat对象)返回给python解释器.
我查看了OpenCV的源代码,发现文件cv2.cpp具有转换函数,可以在PyObject*和OpenCV的Mat之间来回执行转换.我使用了那些转换函数,但在我尝试使用它们时遇到了分段错误.
我基本上需要一些关于如何使用OpenCV来连接python和C++代码的建议/示例代码/在线参考,特别是能够将OpenCV的C++ Mat返回给python解释器,或者可能建议如何/从何处开始调查原因分段错误.
目前我正在使用Boost Python来包装代码.
在此先感谢任何回复.
相关代码:
// This is the function that is giving the segmentation fault.
PyObject* ABC::doSomething(PyObject* image)
{
Mat m;
pyopencv_to(image, m); // This line gives segmentation fault.
// Some code to create cppObj from CPP library that uses OpenCV
cv::Mat processedImage = cppObj->align(m);
return pyopencv_from(processedImage);
}
Run Code Online (Sandbox Code Playgroud)
从OpenCV的源代码转换函数如下.转换代码在带有"if(!PyArray_Check(o))..."的注释行中给出了分段错误.
static int pyopencv_to(const PyObject* o, Mat& m, const char* name = "<unknown>", bool allowND=true)
{
if(!o || o == Py_None)
{
if( !m.data )
m.allocator …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Python应用程序,它使用OpenCV的Python绑定来进行标记检测和其他图像处理.我想使用OpenCV的CUDA模块来CUDA加速我的应用程序的某些部分,并在他们的.hpp文件中注意到他们似乎正在使用Python和Java的OpenCV导出宏.但是,即使我正在构建OpenCV,我似乎也无法访问这些CUDA功能WITH_CUDA=ON.
是否有必要使用诸如PyCUDA之类的包装器来访问GPU功能,例如cudaarithm中的阈值?或者,如果我在Python代码中调用cv2.threshold()(而不是常规的基于CPU的实现),这些CUDA加速函数是否已被使用?
CV_EXPORTS double threshold(InputArray src, OutputArray dst, double thresh, double maxval, int type, Stream& stream = Stream::Null());
Run Code Online (Sandbox Code Playgroud)
我看到的子模块cv2如下:
cv2.cuda,cv2.gpu和cv2.cudaarithm所有回归AttributeError.
我正在运行以构建OpenCV的CMake指令如下:
cmake -DOPENCV_EXTRA_MODULES_PATH=/usr/local/lib/opencv_contrib/modules/ \
-D WITH_CUDA=ON -D CUDA_FAST_MATH=1 \
-D ENABLE_PRECOMPILED_HEADERS=OFF \
-D BUILD_TESTS=OFF -D BUILD_PERF_TESTS=OFF -D BUILD_EXAMPLES=OFF \
-D BUILD_opencv_java=OFF \
-DBUILD_opencv_bgsegm=OFF -DBUILD_opencv_bioinspired=OFF -DBUILD_opencv_ccalib=OFF -DBUILD_opencv_cnn_3dobj=OFF -DBUILD_opencv_contrib_world=OFF -DBUILD_opencv_cvv=OFF -DBUILD_opencv_datasets=OFF -DBUILD_openc
v_dnn=OFF -DBUILD_opencv_dnns_easily_fooled=OFF -DBUILD_opencv_dpm=OFF -DBUILD_opencv_face=OFF -DBUILD_opencv_fuzzy=OFF …Run Code Online (Sandbox Code Playgroud) 我试图使用Cython将一些C++类和函数包装到Python中.到目前为止,我已经包装了2个类,现在我想要包装一个函数.
函数的签名是
std::map<std::string, std::vector<PyObject*>> analyze(PyObject* img, LandmarkDetector::CLNF& clnf_model, LandmarkDetector::FaceModelParameters& params);
我已成功包装CLNF和FaceModelParameters类,我在包装此analyze函数时遇到问题.
该函数处理PyObject*s因为它处理opencv,我希望能够在语言之间轻松传递它们.我正在使用这些函数来执行cv::Pointpython对象之间和python Mat之间的转换cv::Mat.
这是我的pyx文件:
from libcpp.vector cimport vector
from libcpp.map cimport map
from libcpp.string cimport string
from cpython.ref cimport PyObject
from cython.operator cimport dereference as deref
cdef extern from "LandmarkDetectorModel.h" namespace "LandmarkDetector":
cdef cppclass CLNF:
CLNF(string) except +
cdef extern from "LandmarkDetectorParameters.h" namespace "LandmarkDetector":
cdef cppclass FaceModelParameters:
FaceModelParameters(vector[string] &) except +
cdef class PyCLNF:
cdef CLNF …Run Code Online (Sandbox Code Playgroud)