【python】opencv库中cv2.findContours()和cv2.drawContours()函数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了【python】opencv库中cv2.findContours()和cv2.drawContours()函数相关的知识,希望对你有一定的参考价值。

参考技术A 一.查找轮廓

cv2.findContours()

[image,] contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

轮廓检索方式:

轮廓近似方法:

二.绘制轮廓

cv2.drawContours()

cv2.drawContours(img, contours, -1, (0, 0, 255), 2) 

静态 OpenCV 库中的未定义引用

【中文标题】静态 OpenCV 库中的未定义引用【英文标题】:Undefined references in static OpenCV libraries 【发布时间】:2016-10-07 12:14:33 【问题描述】:

我有一个使用 OpenCV 3.1 的 C++ 项目,并且使用共享库可以正常工作。但现在我想使用静态库(位于项目目录中的文件夹中)编译它,因为我希望能够在未安装 OpenCV 的地方导出它(必要时还可以编辑和重新编译)。

这次我重新编译了 OpenCV,将共享库设置为 NO:

make -DCMAKE_BUILD_TYPE=RELEASE -DBUILD_SHARED_LIBS=NO -DCMAKE_INSTALL_PREFIX=~/Desktop/ocv ..

然后我拿走了我需要的库:

libopencv_core.a   libopencv_imgproc.a    libopencv_highgui.a
libopencv_video.a  libopencv_imgcodecs.a  libopencv_videoio.a

然后运行g++ a.cpp libopencv_core.a,其中a.cpp 是一个示例程序,用于测试一切是否正常:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()

    Mat a;
    printf("hello world\n" );
    return 0;

我的问题是我无法链接第一个库(核心),因为我得到了很多这样的未定义引用:

libopencv_core.a(system.cpp.o): In function `cv::Mutex::Mutex()':
system.cpp:(.text._ZN2cv5MutexC2Ev+0x2c): undefined reference to `pthread_mutexattr_init'
system.cpp:(.text._ZN2cv5MutexC2Ev+0x39): undefined reference to `pthread_mutexattr_settype'
system.cpp:(.text._ZN2cv5MutexC2Ev+0x4c): undefined reference to `pthread_mutexattr_destroy'
libopencv_core.a(system.cpp.o): In function `cv::Mutex::trylock()':
system.cpp:(.text._ZN2cv5Mutex7trylockEv+0x8): undefined reference to `pthread_mutex_trylock'
libopencv_core.a(system.cpp.o): In function `cv::TlsAbstraction::TlsAbstraction()':
system.cpp:(.text._ZN2cv14TlsAbstractionC2Ev+0x9): undefined reference to `pthread_key_create'
libopencv_core.a(system.cpp.o): In function `cv::TlsAbstraction::~TlsAbstraction()':

等等。我已经搜索了所有内容,但找不到丢失的内容。非常感谢任何帮助。

附言G++和Ubuntu版本:g++ (Ubuntu 4.8.4-2ubuntu1~14.04.3) 4.8.4

【问题讨论】:

【参考方案1】:

您还需要链接 pthread 库。并将其传递为-pthread

g++ a.cpp libopencv_core.a -pthread

您缺少包含所需代码的其他库。必须有一个 libippicv.a 包含 ippicv* 函数的代码

g++ a.cpp libopencv_core.a libippicv.a -pthread

它应该在第三方库中的某个地方。

【讨论】:

@user3286661 我搜索了它并添加了它,但我总是不必寻找一些 gz 库 --> libopencv_core.a(persistence.cpp.o):在函数 icvPuts(CvFileStorage*, char const*)': persistence.cpp:(.text._ZL7icvPutsP13CvFileStoragePKc+0x22b): undefined reference to gzputs' @Leo 你现在可能需要 libgzip。此外,指定库的顺序也很重要。所以也许你也应该看看那个。 在其他所有人阅读本文时,@LeonardoLanchas 正在进行静态构建。因此,他不仅要链接静态的opencv库,还要链接opencv所需的第三方库。从错误中,猜猜接下来需要哪个lib,添加它,你会看到错误会减少。

以上是关于【python】opencv库中cv2.findContours()和cv2.drawContours()函数的主要内容,如果未能解决你的问题,请参考以下文章

Python库Numpy中的数据类型与OpenCV中数据类型的对应关系以及改写相关代码时需注意的地方

使用Python,OpenCV进行对象追踪

使用Python,OpenCV生成Aruco标记

opencv基础opencv和dlib库中rectangle类型之间的转换

使用Python,OpenCV旋转图像任意角度(完整和局部丢失~)

将 OpenCV 构建为项目的一部分 - 调试 (F11) 到 OpenCV 库中