前言

pybind11功能强大,将C++ 程序包装为python接口,对于不太熟悉C++的同学只需要调用python接口即可,方便实用。之前的一系列pybind11文章大多数是基础的用法,本人学习pybind11的最初动机是想将一个目标跟踪程序(C++代码)封装为python接口,这样每次运行算法时候就不用打开Visaul Studio这样大型IDE(加载慢,电脑容易卡)。C++程序封装为python接口有好几种方法:boost.python, ctype(调用C++ 动态链接库), SWIG, pybind11。 我只简单用过swig, ctype。 SWIG也挺不错的,不仅可以生成python接口,还可以生成Java等其他语言接口,文档详细。

目标跟踪算法

About KCF

KCF(Kernelized Correlation Filter)目标跟踪算法是基于机器学习的,速度快,效果也比较好(抗短时遮挡)。原版的KCF代码是采用opencv, C++实现的, opencv3.2.0(contrib)之后的版本已经将KCF集成到tracking模块,但是测试发现效果不如原版的C++代码。

下面将C++ KCF 采用pybind11包装为python接口。

开发测试环境

windows10, 64bit

Anaconda3, with python3.7

opencv3.4.0, with opencv_contrib

Visual Studio 2017

pycharm

KCF-Python

工程概述

KCF C++程序是采用类进行封装的,所有功能在:KCFTracker类中。 因此,只需要将KCFTracker 类封装为python 接口就大功告成。

Visaul Stduio工程

image.png

python测试工程

image.png

python测试代码

import cv2

import numpy as np

import matplotlib.pyplot as plt

import demo12.kcf_demo as kcf

import time

cv2.useOptimized()

cv2.setUseOptimized(True)

cv2.setNumThreads(4)

capture = cv2.VideoCapture()

assert capture.open('D:\\ti_project\\TI_DSP_LAB\\Video-tools-exe\\video-01\\V90116-132715.mp4')

capture.set(cv2.CAP_PROP_FRAME_WIDTH, 640)

capture.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

frame = np.zeros(shape=[int(capture.get(cv2.CAP_PROP_FRAME_HEIGHT)),

int(capture.get(cv2.CAP_PROP_FRAME_WIDTH)),

3], dtype=np.uint8)

for i in range(1):

capture.read(frame)

rect = cv2.selectROI('Choose object', frame, False, False)

tracker = kcf.KCFTracker(True, True, True, True)

r = [rect[0] + rect[2], rect[1] + rect[3]]

tracker.trackerInit([rect[0], rect[1], rect[0] + rect[2], rect[1] + rect[3]], frame)

count = 0

while True:

ret, frame = capture.read()

if not ret:

print('finish!')

break

t_start = time.time()

rect = tracker.trackerUpdate(frame)

t_stop = time.time()

fps = int(1.0/(t_stop - t_start))

print(rect)

cv2.rectangle(frame, (rect[0], rect[1]), (rect[2], rect[3]), (0, 255, 255), 2)

cv2.putText(frame, '#' + str(count + 1), (64, 64), 1, 1, (255, 0, 0))

cv2.putText(frame, '{}fps'.format(fps), (64, 64+30), 1, 1, (255, 0, 0))

count += 1

cv2.imshow('kcf', frame)

if cv2.waitKey(33) == 'q':

break

demo演示

选取目标

image.png

跟踪过程

image.png

image.png

完整工程实现

在上文中,实现了以下步骤

步骤

首先调试好目标跟踪算法,确保算法正常运行

包含pybind11,为目标跟踪算法编写python接口

采用Visual Studio生成.pyd扩展, 验证python接口的正确性

在python中导入.pyd,调用python接口,验证算法

但是这种直接采用Visual Studio生成.pyd的方式存在一些局限,不能很好的在其他计算机、系统、硬件平台调用,为此,直接发布源码,在相应的平台进行编译生成pyd.

工程

在python工程中,创建一个package, 一般python大多数包的名字都是pyxxxx, 因此这里取名pykcf, 在pykcf包中再新建一个package, 取名tracker

image.png

将之前Visual Studio工程中所有C++代码复制进来,并且创建一个setup.py文件

image.png

编写setup.py文件, setup.py用于设置需要生成的python扩展的配置信息.

Extension python扩展,需要设置C++源码,C++头文件,C++链接库

setup 编译安装python扩展

因此本工程代码中用到了以下第三方库:

opencv

pybind11

numpy

因此,需要包含这些库的头文件,链接库

setup.py

from setuptools import Extension

from setuptools import setup

__version__ = '0.0.1'

ext_module = Extension(

name='kcf_demo',

sources=

[

r'main.cpp',

r'mat_warper.cpp',

r'ndarray_converter.cpp',

r'./kcf/fhog.cpp',

r'./kcf/kcftracker.cpp'

],

include_dirs=

[

r'D:/Anaconda3_2/include',

r'D:/Anaconda3_2/Lib/site-packages/numpy/core/include',

r'D:/opencv3.4.0+contrib/include',

r'D:/pybind11-master/include'

],

library_dirs=

[

r'D:/Anaconda3_2/Lib/site-packages/numpy/core/lib',

r'D:/opencv3.4.0+contrib/x64/vc15/lib'

],

libraries=

[

'opencv_aruco340',

'opencv_bgsegm340',

'opencv_bioinspired340',

'opencv_calib3d340',

'opencv_ccalib340',

'opencv_core340',

'opencv_datasets340',

'opencv_dnn340',

'opencv_dpm340',

'opencv_face340',

'opencv_features2d340',

'opencv_flann340',

'opencv_fuzzy340',

'opencv_hdf340',

'opencv_highgui340',

'opencv_imgcodecs340',

'opencv_imgproc340',

'opencv_img_hash340',

'opencv_line_descriptor340',

'opencv_ml340',

'opencv_objdetect340',

'opencv_optflow340',

'opencv_phase_unwrapping340',

'opencv_photo340',

'opencv_plot340',

'opencv_reg340',

'opencv_rgbd340',

'opencv_saliency340',

'opencv_shape340',

'opencv_stereo340',

'opencv_stitching340',

'opencv_structured_light340',

'opencv_superres340',

'opencv_surface_matching340',

'opencv_text340',

'opencv_tracking340',

'opencv_video340',

'opencv_videoio340',

'opencv_videostab340',

'opencv_xfeatures2d340',

'opencv_ximgproc340',

'opencv_xobjdetect340',

'opencv_xphoto340',

'npymath'

],

language='c++'

)

setup(

name='kcf_demo',

version=__version__,

author_email='xxxx@qq.com',

description='A simaple demo',

ext_modules=[ext_module],

install_requires=['numpy']

)

开始编译生成python扩展,激动!!!, 在pycharm中进入终端,并且进入到setup.py所在目录。

cd ./pykcf/tracker

python setup.py build_ext --inplace

image.png

image.png

image.png

image.png

python扩展生成成功!!!

演示效果

在工程中新建一个demo.py脚本,编写测试代码

image.png

run

首先选择一个跟踪目标,使用鼠标框选,然后Enter,开始跟踪。

image.png

tracking.gif

python opencv kcf_pybind11—目标跟踪demo(KCF,python version)相关推荐

  1. Object Tracking using OpenCV (C++/Python)(使用OpenCV进行目标跟踪)

    本博客翻译搬运自https://www.learnopencv.com/object-tracking-using-opencv-cpp-python,用于初入目标跟踪的新手学习,转贴请注明! 使用O ...

  2. opencv动态目标跟踪学习总结

    用opencv实现对视频中动态目标的追踪 第一步,是要建立一个编程环境,然后加载opencv的库路径等等.具体步骤在 http://www.opencv.org.cn/ 的"安装" ...

  3. 笔记 基于OpenCV的目标跟踪软件与系统实现

    1.目标检测理论包括光流法.帧间差分法和背景差分法, 目标分割理论包括全局阈值法和局部阈值法, 目标跟踪的均值漂移法和卡尔曼滤波法. 2.基于opencv的目标跟踪软件设计于实现 在vc环境下,按照单 ...

  4. 基于Python和OpenCV的目标跟踪学习教程 Object Tracking using Python and OpenCV

    实现12种不同的算法来跟踪视频和网络摄像头中的对象! 你会学到: 使用Python和OpenCV跟踪视频和网络摄像头中的对象 理解跟踪算法的基本直觉 实现12种跟踪算法 了解对象检测和对象跟踪之间的区 ...

  5. Python图像处理,cv2模块,OpenCV实现目标跟踪

    前言 利用Python实现OpenCV目标跟踪.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: cv2模块: 以及一些Python自带的模块. 环境搭建 安装 ...

  6. 基于ModelArts和CANN的端到端行人检测和跟踪Demo(Python版本)【训练篇】

    前言 基于华为云ModelArts和昇腾CANN实现从训练到部署的端到端行人检测和跟踪Demo,这里的CANN使用的是Python接口(Python版本). 在ModelArts完成开发和模型训练 华 ...

  7. OpenCV视频目标跟踪及背景分割器

    目标跟踪 本文主要介绍cv2中的视频分析Camshift和Meanshift. 目标: 学习Meanshift算法和Camshift算法来寻找和追踪视频中的目标物体 Meanshift算法: mean ...

  8. OpenCV实现目标跟踪

    使用opencv3以上在opencv_contib中集成的跟踪算法,实现目标跟踪 在这里选择使用摄像头画面进行跟踪 python代码如下: import cv2 import sysprint cv2 ...

  9. python opencv手册_教你用Python实现5毛钱特效(给你的视频来点料)

    一.前言 请务必看到最后.Python牛已经不是一天两天的事了,但是我开始也没想到,Python能这么牛.前段时间接触了一个批量抠图的模型库,而后在一些视频中找到灵感,觉得应该可以通过抠图的方式,给视 ...

最新文章

  1. 如何使用 Arthas 定位 Spring Boot 接口超时
  2. POJ3348 Cows【凸包+多边形求面积】
  3. 阅读【现代网络技术 SDN/NFV/QOE 物联网和云计算】 第一章
  4. 移动端页面按手机屏幕分辨率自动缩放的js
  5. AngularJS案例:简单计算
  6. 新款苹果手表来了!Apple Watch Series 7将于10月8日开售
  7. 基于JAVA+SpringMVC+Mybatis+MYSQL的养老院管理系统
  8. Android开发学习之路-机器学习库(图像识别)、百度翻译
  9. [Ext JS 4] MVC 应用程序框架
  10. algorithm头文件常用函数
  11. 存管 托管 监管 区别
  12. 苹果开发者账号续费相关问题
  13. 为什么用交叉线而不是直通线连接相同的设备
  14. 学生计算机编程比赛获奖感言,学生技能大赛获奖感言
  15. php网页显示左中,php的动态页面在ie内核的浏览器面整体偏左的解决方法静
  16. Material Theme UI 插件的下载安装与使用,免费版Material Theme UI 插件
  17. 网红茶饮难逃“短命”之殇,喜茶能否打破这个魔咒?
  18. android点击按钮打开蓝牙,Android打开蓝牙的两种方式
  19. 根据指定时间范围取得对应(第几)周信息,以及一年当中所有周时间范围列表信息(可用于学期第几周,年第几周)
  20. 安卓神秘事件之点击事件不响应

热门文章

  1. Mac中如何查看java版本
  2. ble蓝牙在小米8手机上无法连接 status=133
  3. linux 虚拟机网络配置
  4. VirtualBox虚拟机网络配置
  5. 正三角形孔的机构原理及运动仿真
  6. SQL实现广告数据多维度的提取
  7. 智能电视芯片市场现状及未来发展趋势
  8. js实现页面滚动切换导航栏/点击导航栏跳转到指定位置
  9. mysql 添加索引卡死_mysql添加索引,查询反而变慢
  10. python画鱼_Python 水母吃鱼游戏 pygame