OpenCV4.0发布已经快两个月啦,Python社区终于推出了OpenCV Python4.0的安装包与扩展模块安装包,下载地址如下:
https://pypi.org/project/opencv-python/
如果你是第一次使用OpenCV Python开发包,想要安装OpenCV Python4.0只要执行如下命令行即可:
pip install opencv-python
上述命令行会成功安装OpenCV4.0开发包
如果你还想使用OpenCV Python的扩展模块,执行如下命令行即可:
pip install opencv-contrib-python
上述命令行会既安装OpenCV4.0 release模块又安装扩展模块
如果你已经安装了OpenCV以前的3.x版本只需要执行对应的升级安装命令行如下(假设你已经安装opencv-python 3.x)
pip install –upgrade opencv-python
即可升级安装到最新OpenCV 4.0的Python语言开发包。
如果在安装的时候遇到python命令不识别或者pip命令行不识别,请执行如下的命令行实现安装:
python –m pip install opencv-python
或者
python –m pip install opencv-contrib-python
安装好以后打开pycharm IDE,执行如下测试代码
import cv2 as cv
src = cv.imread("D:/images/test5.png")
cv.imshow("opencv-python", src)
cv.waitKey(0)
cv.destroyAllWindows()
运行显示如下:
注意这些改变只存在与OpenCV-Python与OpenCV-Contrib-Python开发包中
1.在扩展模块中去掉了SIFT与SURF相关API的调用文件
现在如果想在OpenCV Python 4.x中想使用SIFT与SURF只有靠自己从源代码CMake来编译生成python版本的安装包才可以。
2.全部取消CV_XXX这种枚举类型,比如在3.x中可以正常使用的语句
# OpenCV 3.x中
namedWindow(“input”, cv.CV_WINDOW_AUTOSIZE)
# OpenCV4.x
namedWindow(“input”, cv.WINDOW_AUTOSIZE)
3.findContours函数返回结果由3.x的三个参数变为两个参数
# 在OpenCV3.x中轮廓发现API返回三个值分别为
# image 返回的图像
# contours 每个轮廓的点集合
# hierarchy 每个轮廓对应的层次信息
binary, contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
OpenCV4.0中需要改为
contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE)
4.增加了python语言版本的对DNN模块的加持!
支持图像分类、对象检测(SSD、RCNN、Faster-RCNN、mask-RCNN)、图像分割等网络的使用,而且代码特别简洁,以图像分类Inception h5模型代码调用为例,演示如下:
import cv2 as cv
import numpy as np
bin_model = "D:/projects/opencv_tutorial/data/models/googlenet/bvlc_googlenet.caffemodel"
protxt = "D:/projects/opencv_tutorial/data/models/googlenet/bvlc_googlenet.prototxt"
# Load names of classes
classes = None
with open("classification_classes_ILSVRC2012.txt", 'rt') as f:
classes = f.read().rstrip('\n').split('\n')
# Load a network
net = cv.dnn.readNetFromCaffe(protxt, bin_model)
winName = 'Deep learning image classification in OpenCV'
cv.namedWindow(winName, cv.WINDOW_AUTOSIZE)
cap = cv.VideoCapture("D:/images/video/lane.avi")
while cv.waitKey(1) < 0:
hasFrame, frame = cap.read()
if not hasFrame:
cv.waitKey()
break
result = np.copy(frame)
# Create a 4D blob from a frame.
blob = cv.dnn.blobFromImage(frame, 1.0, (224, 224), (104, 117,123), False, crop=False)
# Run a model
net.setInput(blob)
out = net.forward()
# Get a class with a highest score.
out = out.flatten()
classId = np.argmax(out)
confidence = out[classId]
# Put efficiency information.
t, _ = net.getPerfProfile()
label = 'Inference time: %.2f ms' % (t * 1000.0 / cv.getTickFrequency())
cv.putText(result, label, (0, 15), cv.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0))
# Print predicted class.
label = '%s: %.4f' % (classes[classId] if classes else 'Class #%d' % classId, confidence)
cv.putText(result, label, (100, 50), cv.FONT_HERSHEY_SIMPLEX, 1.0, (0, 255, 0), 2)
cv.imshow(winName, result)
运行截图如下
5.最不可思议的改动-级联检测器训练工具不见啦
-opencv_createsamples
-opencv_traincascade
上述两个级联检测器训练的工具居然神奇的从release模块中消失啦,而且在OpenCV4.0的官方release notes中居然没有任何说明!望周知!想训练级联检测器千万别用4.0.x的版本了。
总结
OpenCV4.0已经更新了有一段时间了,从C++ API到这几天刚刚出炉的OpenCV-Python API我一直在不断使用,调用常见模块大多数的相关API,总来说接口规范比以前进步很大,很多算法的API都用过同一个API给予不同的参数即可调用,大部分接口采用了代码实现与API分离的设计原则,极大的降低了学习成本,有利于初学者更快的学习入门。