- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
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/
.splice() 方法的基本问题,以及如何最好地从数组中删除元素。 我想使用 .splice() 从数组中删除一个项目,但是当我这样做时,我希望返回原始数组 减去 删除的元素。 .splice()
我正在过滤同位素库。单击按钮会添加到称为过滤器的数组中。这是正常工作的,但是当用户单击事件按钮时,我希望从数组中删除过滤的类别。由于某种原因,事实并非如此。 这是特定的代码: if($(this).h
几个月前,我将一个 Subversion 存储库转换为 Mercurial,结果在我的修订历史中留下了两个毫无意义的空白。我试图弄清楚我是否可以拼接间隙,但我一直无法让工具精确地完成我想要的。 在项目
我制作简单的射击游戏,但有一个问题(有时): GIF Game problem 3颗子弹被移除(但只有一颗子弹相撞)。子弹和敌人(蓝色方 block )位于一个数组中(var objects = []
假设我们在 JavaScript 中有两个数组,[3,4,7] 和 [5,6]。 在不排序或使用 .apply 的情况下,将 [5,6] 插入索引 2 处的 [3,4,7] 的最佳方式是什么实现结果数
我试图在从数组中删除项目时添加纸质警报对话框,但我似乎无法理解这是如何工作的。 我现在可以使用以下功能,无需对话框: _delete(e) { var index = this.t
我正在尝试使用 splice() 从 jQuery 对象中删除元素. 但是,最终发生的情况是所有其他项目都被删除。我假设这是由于使用 splice 重新索引造成的。 我要淡入每个 所以我需要从顶部开始
这是我尝试从数组中动态删除一个值的尝试 $('.btn-remove').click(function() { var players = ["compare","13076","13075"
我正在考虑在 Visual Studio 2008 上使用 OpenCV 2.3.1 实时拼接来自 2 个或更多(目前可能是 3 或 4 个)摄像头的图像。 但是,我很好奇它是如何完成的。 最近研究了
我在将两个数组拼接在一起时遇到问题。假设我有两个数组: a = array([1,2,3]) b = array([4,5,6]) 当我执行 vstack((a,b)) 时,我得到了 [[1,2,3]
我拼接 css 文件以提高性能。 现在我想包含一个 minify 函数,如下所示。我该如何合并它? function minify( $css ) { $css = preg_replace(
我有两个 matlab 向量。第一个有 N 个元素,另一个有 k*N。我知道 k 是什么,我想拼接列表,使第一个向量中的每个元素出现在下一个向量中相应的 k 元素之前。例如: k = 3 x = [1
我有以下上下文: https://jsfiddle.net/eqntaqbt/2/ obj.forEach(function(user, index){ var userName = user
假设你有一个像这样的数组: var arr= [{id:121, v:'a'}, {id:232, 'b'}]; 你需要找到 id: 232 并删除它,所以你可以这样做: for (var i = a
似乎是通过 建立报价语法非常低效。例如创建一个整数列表 let q1 = List.foldBack (fun n acc -> ) [1..100000] Real: 00:00:05.714,
我正在为一家希望为其用户创建服务的公司开发应用程序。该公司目前提供时长约为 1.5 小时的视频,他们想要集成的服务是让用户能够“录制”这个较大视频的剪辑,以创建本质上的精彩片段。此服务的最终结果将是
splice 当 OFFSET 在数组中但 LENGTH 的末尾超过数组末尾时,是否可以? 最佳答案 易于尝试。 $ perl -wE' my @a = "a".."e"; my @b =
以前从未使用过 Tkinter,我不太确定如何使用它或它是如何工作的。 Windows IDLE Shell。 import time from tkinter import * input("Pre
这里是 Javascript 新手 -- 我有以下数组: var group = ({ one: value1, two: value2, three:
我的屏幕上打印了以下行: Would you like to pay €xx to POS_ID Latte X 1....€2.50-Salad X 1....€4.00-Wrap X 1..
我是一名优秀的程序员,十分优秀!