python - 在 python 中从 BackgroundSubtractorMOG2 获取背景模型

标签 python opencv mog

我需要用 opencv 获取高斯混合的背景模型。我知道在 C++ 中有一个名为 getBackgroundImage 的方法,我搜索了是否可以在 python 界面中获取它,但我没有得到好的结果。我试过 opencv 3.0.0-dev 因为它有 BackgroundSubtractorMOG2 实现,但是 help() 函数没有记录后台模型的方法实现。您知道是否有未记录的实现吗?我搜索了 how to edit opencv source to implement a python implementation 但我还没有找到关于它的文档。我更喜欢避免使用 scipy.weave 来编译 C++ 代码,而且我不知道 scipy.weave 在这种情况下是否有用

最佳答案

改编Zaw Lin的解决方案

  • Ubuntu 18.04
  • 通过 apt install libopencv-dev 安装 OpenCV 3.2

主要区别在于结果 (fg/bg) 图像是在 python 中创建/分配的,然后传递给 c++ 库。 Zaw Lin 的解决方案给我错误 (errno 139 - SIG_SEGV),因为应用程序正在访问无效的内存区域。希望它可以节省几个小时:)

mog2.cpp:

#include <opencv2/opencv.hpp>

cv::BackgroundSubtractorMOG2 *mog = cv::createBackgroundSubtractorMOG2 (500, 16, false);

extern "C" void getfg(int rows, int cols, unsigned char* imgData,
        unsigned char *fgD) {
    cv::Mat img(rows, cols, CV_8UC3, (void *) imgData);
    cv::Mat fg(rows, cols, CV_8UC1, fgD);
    mog->apply(img, fg);
}

extern "C" void getbg(int rows, int cols, unsigned char *bgD) {
    cv::Mat bg = cv::Mat(rows, cols, CV_8UC3, bgD);
    mog->getBackgroundImage(bg);
}

像这样编译:

gcc  \
    -shared \
    -o libmog2.so  \
    -fPIC ./mog2.cpp  \
    -lopencv_core -lopencv_highgui -lopencv_objdetect -lopencv_imgproc -lopencv_features2d -lopencv_ml -lopencv_calib3d -lopencv_video

然后是 python :

mog2.py

import numpy as np
import ctypes as C
import cv2

libmog = C.cdll.LoadLibrary('path/to/libmog2.so')

def getfg(img):
    (rows, cols) = (img.shape[0], img.shape[1])
    res = np.zeros(dtype=np.uint8, shape=(rows, cols))
    libmog.getfg(img.shape[0], img.shape[1],
                       img.ctypes.data_as(C.POINTER(C.c_ubyte)),
                       res.ctypes.data_as(C.POINTER(C.c_ubyte)))
    return res


def getbg(img):
    (rows, cols) = (img.shape[0], img.shape[1])
    res = np.zeros(dtype=np.uint8, shape=(rows, cols, 3))

    libmog.getbg(rows, cols, res.ctypes.data_as(C.POINTER(C.c_ubyte)))
    return res


if __name__ == '__main__':
    c = cv2.VideoCapture(0)
    while 1:
        _, f = c.read()
        cv2.imshow('f', f)
        cv2.imshow('fg', getfg(f))
        cv2.imshow('bg', getbg(f))
        if cv2.waitKey(1) == 27:
            exit(0)

关于python - 在 python 中从 BackgroundSubtractorMOG2 获取背景模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19031836/

相关文章:

python - 如何安装 pyodbc 以在 ipython 中使用

python - 我应该使用什么分类模型?机器学习新手。需要推荐

numpy - 当我尝试使用 Keras 预处理功能向图像添加噪声时出现错误参数错误

c++ - 运行代码时opencv_world 331.dll访问冲突

OpenCV:如何使用 createBackgroundSubtractorMOG

python - 如何使用另一个函数的返回类型来注释 Python 函数?

当满足时间序列的条件时,Python Pandas 会聚合过去的行

OpenCV锐化边缘(没有孔的边缘)

opencv - OPENCV:如何减去摄像头的背景?