gpt4 book ai didi

python - 使用来自 python 的 opencv 拼接器

转载 作者:太空宇宙 更新时间:2023-11-03 20:55:14 25 4
gpt4 key购买 nike

OpenCV 可以与 python 绑定(bind)一起使用,并且效果很好。但是我想知道(真的希望)是否可以使用 OpenCv's stitcher在 python 中也是如此。我已经尝试了几件事,但无法让它发挥作用。如果可能的话,我可能需要做一个额外的导入,但我无法弄清楚,谷歌也没有给我答案。希望你们中有 opencv-python 大师可以帮助我。

最佳答案

好吧,我终于明白了。到目前为止,我只移植了带有两个参数的 stitch 方法,如果您无法公开您可能需要的任何其他内容,请问我。

构建它的最简单方法是以与位置无关的方式(gcc 的 -fPIC 选项)将所有内容编译到动态库中,同时链接 opencv_core 和 opencv_stitching 库。您还必须为要构建的任何版本的 python 添加 include 目录,以便它可以找到正确的 Python.h header 。

如果构建正确,您将能够像使用 python 模块一样使用编译后的库。

不幸的是,由于它们不提供对构造函数的访问,我不得不满足于创建一个全局实例。如果还有另一种优雅的方式,我洗耳恭听(眼睛)。这意味着无论何时调用 .Stitcher() 构造函数,它都会返回相同的实例(有一个单独的实例在构造期间尝试使用 GPU,为此使用 .Stitcher(True))。

这是我的 pythonPort.h 文件:

/* 
* File: pythonPort.h
* Author: algomorph
*
* Created on December 5, 2012, 10:18 AM
*/

#ifndef PYTHONPORT_H
#define PYTHONPORT_H

#define MODULESTR "mycv"


#include "Python.h"
#include "numpy/ndarrayobject.h"
#include <opencv2/core/core.hpp>
#include <opencv2/stitching/stitcher.hpp>
/*
//include your own custom extensions here
#include "savgol.h"
#include "filters.hpp"
*/
#include "pythonPortAux.h"

#endif

MODULESTR 应该是你想命名你的模块的任何东西。我将其与它编译的库的名称保持一致。

您必须从 cv2.cpp 文件中复制您需要的任何 opencv_to 和 opencv_from 例程,并将其放入我的 pythonPortAux.h 之类的文件中。我的套路很多,你可以找找at this link . MKTYPE2 宏也在那里。

剩下的在下面的 pythonPort.cpp 文件中(我还有其他东西,这只是与 Stitcher 相关的部分):

#include "pythonPort.h"

struct pycvex_Stitcher_t
{
PyObject_HEAD
Ptr<cv::Stitcher> v;
};

static PyTypeObject pycvex_Stitcher_Type =
{
PyObject_HEAD_INIT(&PyType_Type)
0,
MODULESTR".Stitcher",
sizeof(pycvex_Stitcher_t),
};

static void pycvex_Stitcher_dealloc(PyObject* self)
{
//((pycvex_Stitcher_t*)self)->v.release();
PyObject_Del(self);
}

static PyObject* pyopencv_from(const Ptr<cv::Stitcher>& r)
{
pycvex_Stitcher_t *m = PyObject_NEW(pycvex_Stitcher_t, &pycvex_Stitcher_Type);
new (&(m->v)) Ptr<cv::Stitcher>(); // init Ptr with placement new
m->v = r;
return (PyObject*)m;
}

static bool pyopencv_to(PyObject* src, Ptr<cv::Stitcher>& dst, const char* name="<unknown>")
{
if( src == NULL || src == Py_None )
return true;
if(!PyObject_TypeCheck(src, &pycvex_Stitcher_Type))
{
failmsg("Expected cv::Stitcher for argument '%s'", name);
return false;
}
dst = ((pycvex_Stitcher_t*)src)->v;
return true;
}

static PyObject* pycvex_Stitcher_repr(PyObject* self)
{
char str[1000];
sprintf(str, "<Stitcher %p>", self);
return PyString_FromString(str);
}

Stitcher gStitcher = cv::Stitcher::createDefault(false);
Stitcher gStitcherGPU = cv::Stitcher::createDefault(true);

static PyObject* pycvex_Stitcher_Stitcher(PyObject* , PyObject* args, PyObject* kw)
{
PyErr_Clear();
{
pycvex_Stitcher_t* self = 0;
bool try_use_gpu = false;

const char* keywords[] = { "img", "pt1", "pt2","connectivity","leftToRight", NULL };
if (PyArg_ParseTupleAndKeywords(args, kw, "|b:Stitcher",
(char**) keywords, &try_use_gpu)){
self = PyObject_NEW(pycvex_Stitcher_t, &pycvex_Stitcher_Type);
if (self)
ERRWRAP2(
if(try_use_gpu)
self->v = &gStitcherGPU;
else
self->v = &gStitcher;
);
return (PyObject*) self;
}
}
return NULL;
}
static PyGetSetDef pycvex_Stitcher_getseters[] =
{
{NULL} /* Sentinel */
};

static PyObject* pycvex_Stitcher_stitch(PyObject* self, PyObject* args, PyObject* kw){
if(!PyObject_TypeCheck(self, &pycvex_Stitcher_Type))
return failmsgp("Incorrect type of self (must be 'Stitcher' or its derivative)");
Stitcher* _self_ = ((pycvex_Stitcher_t*)self)->v;
//Stitcher::Status status;
int status;

PyObject* pyobj_images = NULL;
vector<Mat> images = vector<Mat>();
Mat pano;

const char* keywords[] = { "images", NULL };
if( PyArg_ParseTupleAndKeywords(args, kw, "O:Stitcher.stitch", (char**)keywords, &pyobj_images) &&
pyopencv_to(pyobj_images, images, ArgInfo("images", false)))
{
ERRWRAP2( status = (int)_self_->stitch(images, pano));
return Py_BuildValue("(NN)", pyopencv_from(status), pyopencv_from(pano));
}

return NULL;
}

static PyMethodDef pycvex_Stitcher_methods[] =
{
{"stitch", (PyCFunction)pycvex_Stitcher_stitch, METH_KEYWORDS, "stitch(image) -> status, pano"},
{NULL, NULL}
};

static void pycvex_Stitcher_specials(void)
{
pycvex_Stitcher_Type.tp_base = NULL;
pycvex_Stitcher_Type.tp_dealloc = pycvex_Stitcher_dealloc;
pycvex_Stitcher_Type.tp_repr = pycvex_Stitcher_repr;
pycvex_Stitcher_Type.tp_getset = pycvex_Stitcher_getseters;
pycvex_Stitcher_Type.tp_methods = pycvex_Stitcher_methods;
}


static PyMethodDef methods[] = {
{"Stitcher",(PyCFunction)pycvex_Stitcher_Stitcher, METH_KEYWORDS, "Stitcher([tryUseGpu=False]) -> <Stitcher object>"},
{NULL, NULL}
};

extern "C"{
#if defined WIN32 || defined _WIN32
__declspec(dllexport)
#endif
void initcvex()
{
MKTYPE2(Stitcher);
import_array();
PyObject* m = Py_InitModule(MODULESTR, methods);
PyObject* d = PyModule_GetDict(m);
//PyDict_SetItemString(d, "__version__", PyString_FromString(CV_VERSION))
opencv_error = PyErr_NewException((char*)MODULESTR".error", NULL, NULL);
PyDict_SetItemString(d, "error", opencv_error);
}
}

关于python - 使用来自 python 的 opencv 拼接器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11853960/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com