- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何从C/C++扩展源代码获取Windows的pyd文件(或其他我可以导入到Python的项目)?
编辑:我想要使用的特定库(BRISK)包含在OpenCV 2.4.3中,因此我暂时对这种技能的需求消失了。如果您是来这里寻找危险的,这是我发布的一个简单的BRISK in Python demo。
我有想要在python应用程序中构建和使用的Brisk源代码(download)。我可以生成一个brisk.pyd文件...但是它是0字节。如果有一种针对brisk.pyd文件的更好/替代的方法,那么我当然也愿意这样做。
编辑:请忽略下面我原始问题中的所有尝试,并查看我的答案是由obmarg的详细演练提供的
我要去哪里错了?
from distutils.core import setup, Extension
module1 = Extension('brisk',
include_dirs = ['include', 'C:/opencv2.4/build/include', 'C:/brisk/thirdparty/agast/include'],
#libraries = ['agast_static', 'brisk_static'],
#library_dirs = ['win32/lib'],
sources = ['src/brisk.cpp'])
setup (name = 'BriskPackage',
ext_modules = [module1])
running build
running build_ext
creating build\lib.win32-2.7
C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\link.exe /DLL /nologo /INCREMENTAL:NO /LIBPATH:win32/lib /LIB
PATH:C:\Python27_32bit\libs /LIBPATH:C:\Python27_32bit\PCbuild agast_static.lib brisk_static.lib /EXPORT:initbrisk build
\temp.win32-2.7\Release\src/brisk.obj /OUT:build\lib.win32-2.7\brisk.pyd /IMPLIB:build\temp.win32-2.7\Release\src\brisk.
lib /MANIFESTFILE:build\temp.win32-2.7\Release\src\brisk.pyd.manifest
LINK : error LNK2001: unresolved external symbol initbrisk
build\temp.win32-2.7\Release\src\brisk.lib : fatal error LNK1120: 1 unresolved externals
error: command '"C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\BIN\link.exe"' failed with exit status 1120
win32/lib/Release/
agast_static.lib
brisk_static.lib
build/ (empty)
include/brisk/
brisk.h
hammingsse.hpp
src
brisk.cpp
demo.cpp
thirdparty/agast/
include/agast/
agast5_8.h ....
cvWrapper.h
src/
agast5_8.cc ...
CMakeLists.txt
win32/
bin/
brisk.mexw32
opencv_calib3d220.dll ...
lib/
agast_static.lib
brisk_static.lib
CMakeLists.txt
FindOpenCV.cmake
Makefile
最佳答案
您确定这个轻快的库甚至可以导出python绑定(bind)吗?我在源代码中看不到任何引用-它甚至似乎都没有导入python头文件。这肯定可以解释为什么到目前为止您没有取得太大的成功-您不能只编译纯C++代码并期望python与之交互。
我认为您的第二个distutils示例最接近正确-它显然是在编译内容并进入链接器阶段,但是随后遇到此错误。该错误只是意味着它找不到名为initbrisk的函数,我猜这将是模块的顶级init函数。同样,这表明您正在尝试从不适合它的代码中编译python模块。
如果您想自己将C++代码包装在python包装器中,则可以看看the official documentation on writing c/c++ extensions。另外,您可以看看boost::python,SIP或shiboken,它们尝试某种程度(或完全)自动化从C++代码制作python扩展的过程。
编辑:既然您似乎已经为自己解决问题做出了相当大的努力,并发布了一个很好的问题,我决定就如何执行此操作给出更详细的答复。
使用boost::python包装C++库的快速教程
就我个人而言,我只使用过boost::python这样的东西,所以我将尝试为您做一个很好的总结。我将假定您使用的是Visual C++2010。我还将假定您安装了32位版本的python,因为我相信boost pro库仅提供32位二进制文件。
安装升压
首先,您需要获取boost库的副本。最简单的方法是从the boost pro website下载安装程序。这些应该安装在Windows上使用boost c++库所需的所有头文件和二进制文件。请注意将这些文件安装到的位置,因为稍后将需要它们-最好将其安装到路径中没有空格的位置。为简单起见,我假设您将这些文件放在C:\boost中,但是您可以将其替换为实际使用的路径。
另外,您可以按照these instructions从源代码构建增强功能。我不确定100%,但是可能是为了获得与您安装的python版本兼容的boost::python版本,您需要这样做。
设置视觉工作室项目
接下来,您将要为brisk.pyd设置一个Visual Studio项目。如果打开Visual Studio,请转到“新建”->“项目”,然后找到Win32 Project的选项。设置您的位置等,然后单击“确定”。在出现的向导中,选择一个DLL项目类型,然后选中空项目复选框。
现在,您已经创建了项目,您需要设置include&library路径,以允许您使用python,boost::python和brisk.lib文件。
在Visual Studios解决方案资源管理器中,右键单击您的项目,然后从出现的菜单中选择属性。这将打开您的项目的属性页。转到链接器->常规部分,然后查找其他库目录部分。您需要使用.lib
文件的路径填充boost,python和brisk_static.lib
的路径。通常,这些可以在的lib
(或libs
)子目录中找到
无论您将库安装在哪里。路径用分号分隔。我在下面附上了我的设置的屏幕截图:
接下来,您需要使Visual Studio链接到.lib文件。这些部分可以在属性的“链接器”->“输入”部分的“附加依赖项”字段中找到。同样,这是一个用分号分隔的列表。您应该需要为python添加库(在我的情况下为python27.lib
,但这会因版本而异)和brisk_static.lib
。这些不需要完整路径,就像您在上一阶段中添加的那样。同样,这是一个屏幕截图:
您可能还需要添加boost_python库文件,但是我认为boost使用一些头文件魔术可以为您节省麻烦。如果我不正确,那么请查看一下提升类似于boost_python-vc100-mt.lib
的文件的库路径并将其添加。
最后,您需要设置包含路径,以允许您的项目包含相关的C++头文件。要使相关设置显示在项目属性中,您需要向项目中添加.cpp文件。右键单击您的解决方案资源管理器中的源文件文件夹,然后去添加新项。选择一个C++文件(.cpp),并将其命名为main.cpp(或其他所需名称)。
接下来,返回您的项目属性,然后转到C/C++-> General。在附加库目录下,您需要添加轻快,python和boost的包含路径。再次,为分隔符使用分号,并再次提供屏幕截图:
我怀疑您可能需要更新这些设置以同时包含opencv2和agast库,但我将把它留给您自己解决,因为它应该是相同的过程。
用boost::python包装现有的c++类。
现在有点棘手了-实际编写C++将您的轻快库包装在boost python中。您可以找到有关here的教程,但我也将尝试对其进行详细介绍。
这将在您之前创建的main.cpp
文件中进行。首先,在文件顶部添加所需的相关include语句:
#include <brisk/brisk.h>
#include <Python.h>
#include <boost/python.hpp>
BOOST_PYTHON_MODULE(brisk)
{
}
brisk
的python模块。
BOOST_PYTHON_MODULE(brisk)
{
using namespace boost::python;
class_< cv::BriskPatternPoint >( "BriskPatternPoint" )
.def_readwrite("x", &cv::BriskPatternPoint::x)
.def_readwrite("y", &cv::BriskPatternPoint::y)
.def_readwrite("sigma", &cv::BriskPatternPoint::sigma);
class< cv::BriskScaleSpace >( "BriskScaleSpace", init< uint8_t >() )
.def( "constructPyramid", &cv::BriskScaleSpace::constructPyramid );
}
class_< cv::BriskPatternPoint >( "BriskPatternPoint" )
告诉boost::python使用
cv::BriskPatternPoint
C++类声明一个类,并在python中将其公开为
BriskPatternPoint
。
.def_readwrite("y", &cv::BriskPatternPoint::y)
向
BriskPatternPoint
类添加了一个可读和可写的属性。该属性名为y,它将映射到
BriskPatternPoint::y
c++字段。
class< cv::BriskScaleSpace >( "BriskScaleSpace", init< uint8_t >() )
声明了另一个类,这次是
BriskScaleSpace
,但它还提供了一个接受uint8_t的构造函数(一个无符号字节-应该只映射为python中的整数,但是我要小心不要传入大于255个字节的整数-我不不知道在那种情况下会发生什么)
.def
行仅声明了一个函数-boost::python(我认为)应该能够自动确定函数的参数类型,因此您无需提供它们。
site-packages
),将其导入并使用即可!
import brisk
patternPoint = brisk.BriskPatternPoint()
....
关于c++ - 如何从c/c++源代码获取Windows的python .pyd? (更新: brisk now in Python in case that's what you want),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10664658/
我正在尝试运行多个 CMT trackers同时地。出于这个原因,我设置了一个线程池: import argparse import cv2 from multiprocessing import P
下面显示的 Brisk 检测器没有给我任何关键点。有人可以提出一个问题吗?我将尝试用一些代码在下面解释我在做什么。 #include "opencv2/features2d/features2d.hp
我将开发一个包含大量数据的可扩展网络应用程序。我正在考虑使用 Brisk。有人用过吗?有一些很好的资源解释了如何使用它,但它看起来仍然很新并且资源数量有限(即使在 stackoverflow 中也有不
我的理解有点问题。 opencv 中 Brisk 描述符 Mat 值的标准类型是一个标准大小为 8 位的 unsigned char 值。 KeyPoint 的完整描述符的大小为 16 个 unsig
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我正在尝试使用 openCV 包装器 javacv 在 java 中运行 BRISK。我在运行 FAST 角检测器时没有任何问题,但我对如何运行计算功能感到困惑。当我运行这段代码时: private
我在 python 中有以下代码 import cv2 import numpy as np def save_keypoints(image_path, type_image): img =
我在打开的简历中使用 BREIF 描述符时遇到错误。错误是 BREIF 无法给出所有关键点的描述符。它给出的关键点数量少于预期的描述符。我得到的错误如下。错误仅使用 breif 描述符。使用 SURF
我正在尝试使用 OpenCV(用于 C++)的 BRISK 实现来检查照片中是否包含图像(或图像的一部分)。例如,我拍了一张照片,然后尝试将其与数据库中的一组图像匹配,我想选择最佳对应图像(如果所有图
我正在使用 MATLAB 2014a 提取BRISK 和FREAK 描述符。我找不到任何选项可以将位串大小减小到 128 或 256,它们都生成为 512 位。我认为 FREAK 算法不允许这样做,但
如何从C/C++扩展源代码获取Windows的pyd文件(或其他我可以导入到Python的项目)? 编辑:我想要使用的特定库(BRISK)包含在OpenCV 2.4.3中,因此我暂时对这种技能的需求消
我是一名优秀的程序员,十分优秀!