C++程序员也能用上NumPy

MrLee11月前 908

NumPy(Numerical Python)是Python的一种开源的数值计算扩展。这种工具可用来存储和处理大型矩阵,比Python自身的嵌套列表(nested list structure)结构要高效的多(该结构也可以用来表示矩阵(matrix)),支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。


本文主要介绍的是C++版本的,地址:https://github.com/dpilger26/NumCpp

这就是C++版本的NumPy,名为NumCpp,是一位叫David Pilger的程序员开发的。从此用#include也能导入头文件,就像Python程序员用import一样容易。

二者除了语法上的差异,调用函数的名称也几乎一致。就算有什么不懂,你也可以去David的说明文档页查找具体用法。

以最基础的数组定义和初始化为例,NumCpp可以直接定义数组、改变数组形状、转换变量类型、生成对角矩阵等等。

从上图可以看出,NumPy和NumCpp调用的函数名称几乎完全一致,除了在定义数据类型上有一些差别。需要注意的是NumpCpp中的创建一个数组调用的是NdArray,而Python上用的是array。

如果需要更详细的了解两种工具包的差异。可以去下面的命名空间、数据结构索引中查看。

命名空间列表按照功能分类,命名空间成员则按照名称排序。数据结构也与之类似。

附上python实例:

安装NumPy

python -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose

可能需要更新pip提示,直接upgrade就行了。

测试代码

>>> from numpy import *
>>> eye(4)
array([[1., 0., 0., 0.],
       [0., 1., 0., 0.],
       [0., 0., 1., 0.],
       [0., 0., 0., 1.]])

安装Opencv

python -m pip install opencv-python

如果中断可以尝试用梯子或者多试几次!

测试代码:

# -*- coding: utf-8 -*
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
panel = np.zeros([100, 700], np.uint8)
cv2.namedWindow('panel')
def nothing(x):
	pass
    
cv2.createTrackbar('L – h', 'panel', 0, 179, nothing)
cv2.createTrackbar('U – h', 'panel', 179, 179, nothing)
cv2.createTrackbar('L – s', 'panel', 0, 255, nothing)
cv2.createTrackbar('U – s', 'panel', 255, 255, nothing)
cv2.createTrackbar('L – v', 'panel', 0, 255, nothing)
cv2.createTrackbar('U – v', 'panel', 255, 255, nothing)
cv2.createTrackbar('S ROWS', 'panel', 0, 480, nothing)
cv2.createTrackbar('E ROWS', 'panel', 480, 480, nothing)
cv2.createTrackbar('S COL', 'panel', 0, 640, nothing)
cv2.createTrackbar('E COL', 'panel', 640, 640, nothing)
while True:
    #_, frame = cap.read()
    #if not frame:
    #    print 'frame is empty'
    #    break
    s_r = cv2.getTrackbarPos('S ROWS', 'panel')
    e_r = cv2.getTrackbarPos('E ROWS', 'panel')
    s_c = cv2.getTrackbarPos('S COL', 'panel')
    e_c = cv2.getTrackbarPos('E COL', 'panel')
    #roi = frame[s_r: e_r, s_c: e_c]
    roi = cv2.imread('D:\\test.jpg')
    hsv = cv2.cvtColor(roi, cv2.COLOR_BGR2HSV)
    l_h = cv2.getTrackbarPos('L – h', 'panel')
    u_h = cv2.getTrackbarPos('U – h', 'panel')
    l_s = cv2.getTrackbarPos('L – s', 'panel')
    u_s = cv2.getTrackbarPos('U – s', 'panel')
    l_v = cv2.getTrackbarPos('L – v', 'panel')
    u_v = cv2.getTrackbarPos('U – v', 'panel')
    lower_green = np.array([l_h, l_s, l_v])
    upper_green = np.array([u_h, u_s, u_v])
    mask = cv2.inRange(hsv, lower_green, upper_green)
    mask_inv = cv2.bitwise_not(mask)
    bg = cv2.bitwise_and(roi, roi, mask=mask)
    fg = cv2.bitwise_and(roi, roi, mask=mask_inv)
    cv2.imshow('bg', bg)
    cv2.imshow('fg', fg)
    cv2.imshow('panel', panel)
    k = cv2.waitKey(30) & 0xFF
    if k == 27:
        break
        
cap.release()
cv2.destroyAllWindows()


本文链接:https://www.it72.com/12648.htm

推荐阅读
最新回复 (0)
    返回