AI备忘录 - opencv4.0
type: channel
link: http://aiuai.cn/tag/opencv4-0
items: Python - OpenCV之cv2.imdecode和imencode
items: Python - OpenCV 之图片素描化
items: Caffe - 与 opencv4 相关问题解决
items: 基于 OpenCV 的 Mask RCNN 实现[译]
items: Faster RCNN 基于 OpenCV DNN 的目标检测实现
items: TensorFlow 目标检测模型转换为 OpenCV DNN 可调用格式
items: OpenPose 基于OpenCV DNN 的多人姿态估计
items: OpenPose 基于OpenCV DNN 的单人姿态估计
items: OpenCV4.X - DNN模块 Python APIs
items: Ubuntu - OpenCV 源码安装与测试

Python - OpenCV之cv2.imdecode和imencode
type: item
date: 2022-02-13T03:07:00+00:00
description: cv2.imdecode() 函数从指定的内存缓存中读取数据，并把数据转换(解码)成图像格式;主要用于从网络传输数据中恢复出图像.cv2.imencode() 函数是将图片格式转换(编码)成流数据，赋值到内存缓存中;主要用于图像数据格式的压缩，方便网络传输.1. cv2.imdecode()读取网络url图像数据，并转换成图片格式：#!/usr/bin/python3 #!--*-- coding: utf-8 --*-- import numpy as np import cv2 import requests url = 'https://www.aiuai.cn/uploads/2202/beeb259c1c4056ce.jpeg' resp = requests.get(url, timeout=3) image = np.asarray(bytearray(resp.content), dtype="uint8") image = cv2.imdecode(image, cv2.IMREAD_COLOR) cv2.imshow('url_image',image) cv2.waitKey()2. cv2.imencode()将图片进行编码，并保存到本地:#!/usr/bin/python3 #!--*-- coding: utf-8 --*-- import numpy as np import cv2 img = cv2.imread('test.jpg') img_encode = cv2.imencode('.jpg', img)[1] #.jpg 编码格式 # img_encode = cv2.imencode('.png', img) #.png 编码格式 img_array = np.array(img_encode) img_str = img_array.tostring() # 缓存数据保存到本地 with open('img_encode.txt', 'w') as f: f.write(img_str) f.flush3. cv2.imencode() + cv2.imdecode()图片编码保存到本地，读取本地文件解码恢复成图片格式：#!/usr/bin/python3 #!--*-- coding: utf-8 --*-- import numpy as np import cv2 #imencode img = cv2.imread('test.jpg') img_encode = cv2.imencode('.jpg', img)[1] #.jpg 编码格式 # img_encode = cv2.imencode('.png', img) #.png 编码格式 img_array = np.array(img_encode) img_str = img_array.tostring() # 缓存数据保存到本地 with open('img_encode.txt', 'w') as f: f.write(img_str) f.flush #imdecode with open('img_encode.txt', 'r') as f: img_str = f.read() img_array = np.fromstring(img_str, np.uint8) #img_array = np.asarray(bytearray(img_str), dtype="uint8") img_decode = cv2.imdecode(img_array, cv2.IMREAD_COLOR) cv2.imshow("img_decode", img_decode) cv2.waitKey()4. 性能提升OpenCV 是基于libjpeg 库进行图片编解码，imdecode 速度可能会慢.这里采用 turbojpeg 库进行速度提升.4.1. cv2.imdecode()#cv2.imdecode img_cv2 = base64.b64decode(data) img_array = np.frombuffer(img_cv2, np.uint8) img_decode = cv2.imdecode(img_array, cv2.IMREAD_COLOR) #turbojpeg from turbojpeg import TurboJPEG,TJPF_GRAY,TJSAMP_GRAY,TJFLAG_PROGRESSIVE,TJPF_BGR turboJpeg_lib_path = '/path/to/libTurboJpeg.so' jpeg = TurboJPEG(turboJpeg_lib_p…

Python - OpenCV 之图片素描化
type: item
date: 2021-12-05T13:53:00+00:00
description: #!/usr/bin/python3 #!--*-- coding: utf-8 --*-- import cv2 img = cv2.imread("elon.jpg") ## Image to Gray Image gray_image = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) ## Gray Image to Inverted Gray Image inverted_gray_image = 255-gray_image ## Blurring The Inverted Gray Image blurred_inverted_gray_image = cv2.GaussianBlur(inverted_gray_image, (19,19),0) ## Inverting the blurred image inverted_blurred_image = 255-blurred_inverted_gray_image ### Preparing Photo sketching sketck = cv2.divide(gray_image, inverted_blurred_image,scale= 256.0) cv2.imshow("Original Image",img) cv2.imshow("Pencil Sketch", sketck) cv2.waitKey(0)如图：

Caffe - 与 opencv4 相关问题解决
type: item
date: 2020-10-08T04:33:00+00:00
description: Ubuntu20.04 编译 Caffe 时与 OpenCV4.X 的问题记录与解决.Caffe - Ubuntu 安装与测试实例及问题解决 - AIUAIUbuntu - OpenCV 源码安装与测试 - AIUAI参考：How to Install OpenCV on Ubuntu 20.04 - 2020.07.05参考：Install OpenCV 4.4.0 and Caffe on Ubuntu 20.04 for Python 3Ubuntu20.04 仓库安装 OpenCV:sudo apt install libopencv-dev python3-opencv查看版本：pkg-config --modversion opencv4 # 4.2.0问题1 - src/caffe/data_transformer.cpp:2:33: fatal error: opencv2/core/core.hpp原因：找不到头文件.解决方案：将 OpenCV 的头文件加入：原： INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/ 新： INCLUDE_DIRS := $(PYTHON_INCLUDE) /usr/local/include /usr/include/hdf5/serial/ /usr/include/opencv4/问题2 - error: ‘CV_INTER_CUBIC’ was not declared in this scope问题：src/caffe/data_transformer.cpp:781:84: error: ‘CV_INTER_CUBIC’ was not declared in this scope cv::resize(crop_bufferM, cv_cropped_img, cv::Size(crop_size, crop_size), 0, 0, CV_INTER_CUBIC); ^~~~~~~~~~~~~~ src/caffe/data_transformer.cpp:781:84: note: suggested alternative: ‘SA_INTERRUPT’ cv::resize(crop_bufferM, cv_cropped_img, cv::Size(crop_size, crop_size), 0, 0, CV_INTER_CUBIC); ^~~~~~~~~~~~~~ SA_INTERRUPT src/caffe/data_transformer.cpp: In member function ‘void caffe::DataTransformer<Dtype>::Transform(const caffe::Datum&, const caffe::Datum&, caffe::Blob<Dtype>*, caffe::Blob<Dtype>*)’: src/caffe/data_transformer.cpp:954:51: error: ‘CV_INTER_NN’ was not declared in this scope cv::resize(M, M, cv::Size(width, height), 0, 0, CV_INTER_NN); ^~~~~~~~~~~ src/caffe/data_transformer.cpp:954:51: note: suggested alternative: ‘CV_INLINE’ cv::resize(M, M, cv::Size(width, height), 0, 0, CV_INTER_NN); ^~~~~~~~~~~ CV_INLINE make: *** [Makefile:592: .build_release/src/caffe/data_transformer.o] Error 1解决方案：在 src/caffe/data_transformer.cpp 中添加：include <opencv2/imgproc/imgproc_c.h>：#ifdef USE_OPENCV #include <opencv2/core/core.hpp> #include <opencv2/core/core.hpp> #include <opencv2/core/mat.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/imgproc/imgpr…

基于 OpenCV 的 Mask RCNN 实现[译]
type: item
date: 2019-06-13T08:13:34+00:00
description: 4原文：Mask R-CNN with OpenCV - 2018.11.19作者：Adrian Rosebrock这篇博文主要是介绍如何基于 OpenCV 使用 Mask R-CNN.Mask R-CNN 可以自动对图片中每个目标的进行分割，并构建像素级的 masks.基于OpenCV DNN的 MaskRCNN 目标检测与实例分割 - AIUAI在博文 YOLOV3 - 基于 OpenCV 的 YOLO 目标检测 - AIUAI 中介绍了基于 OpenCV 的 YOLO 目标检测算法. 目标检测器，如 YOLO，Faster R-CNNs 和 SSDs，输出的是图片中每个目标物体的边界框的 (x, y) 坐标集合. 但是边界框缺乏一定的像素级信息，如 (1)哪些像素属于前景目标；(2) 哪些像素属于背景.博文主要包括：[1] - Mask R-CNN 概览[2] - Mask R-CNN 图片[3] - Mask R-CNN 视频流1. Mask R-CNN 概览1.1. 实例分割 vs. 语义分割如下图，很好的说明了图像分类、目标检测、语义分割和实例分割之间的差异.[1] - 图像分类，旨在预测能够刻画输入图像内容的标签集.[2] - 目标检测，基于图像分类，但是同时会定位图片中目标的位置，则图像的刻画即包括两部分: (1) 每个目标的边界框(x,y) 坐标; (2) 对应每个边界框的相关类别标签.[3] - 语义分割，预测输入图像的每个像素的类别标签(包括背景的类别标签.) 注：上图(c)中 cube 目标均是相同的颜色. 虽然语义分割算法能够对每个目标的像素进行分类，但是不能区分相同类别的两个目标.[4] - 实例分割，即使图像中存在相同类别标签的目标，也能够预测图片中每个目标的像素级 mask. 如上图(d), 每个 cube 都是不同的颜色. 即：实例分割不仅能够定位每个独立的 cube，还能够预测其边界位置.Mask R-CNN 是一种实例分割算法.1.2. Mask R-CNN 简介Mask R-CNN 算法是 He 等在论文 Mask R-CNN(2017) 中提出的.Mask R-CNN 是基于 Girshick 等人在 R-CNN (2013), Fast R-CNN (2015) 和 Faster R-CNN (2015) 中的目标检测工作的.为了更好的理解 Mask R-CNN 算法，这里简单回顾下 R-CNNs:[1] - R-CNN主要包括四步处理：(1)-Step1: 输入一张图片到网络；(2)-Step2: 提取区域候选框(region proposals)，例如采用 Selective Search 算法得到的可能包含目标物体的图片区域.(3)-Step3: 采用迁移学习，即特征提取部分，采用预训练的CNN计算每个候选框(ROI)的特征.(4)-Step4: 采用 SVM 对每个候选框的提取特征进行分类.R-CNN 有效的原因在于 CNN 提取的鲁棒、判别性强的特征. 但，R-CNN 的问题在于其速度相当的慢. 此外，其并不是真正通过深度神经网络来学习定位目标，实际上只是构建了更高级的 HOG + Linear SVM detector 方法.[2] - Fast R-CNN类似于 R-CNN，Fast R-CNN 也采用了 Selective Search 算法来获得区域候选框；不过，其创新点在于 Region of Interest (ROI) Pooling 模块.ROI Pooling 通过对 CNN 的输出的 feature map 提取固定尺寸的窗口(fixed-size window)，并采用窗口内的特征得到最终的类别标签和边界框. Fast R-CNN 最重要的提升是，有效的实现了网络的 end-to-end 训练，其过程主要为：(1)-给定输入图片及对应的 ground-truth 边界框;(2)-提取特征图(feature map);(3)-采用 ROI Pooling 处理，得到 ROI 特征向量;(4)-最后，采用两个 FC 层，同时得到每个候选框的类别标签预测和边界框位置.虽然 Fast R-CNN 是 end-to-end 训练的，但是由于依赖于 Selective Search 算法，其在预测推断时，速度明显受影响.[3] - Faster R-CNN为了进一步提升 R-CNN 结构的速度，Faster R-CNN 直接将区域候选框选取(region propoasal) 整合进网络结构中.**Faster R-CNN 提出 Region Proposal Network (RPN)，以实现将区域候选框选取(region propoasal) 直接整合进网络中…

Faster RCNN 基于 OpenCV DNN 的目标检测实现
type: item
date: 2019-04-02T06:17:00+00:00
description: 在前面已经测试过 YOLOV3 和 SSD 基于 OpenCV DNN 的目标检测实现，这里再简单实现下 Faster RCNN 基于 DNN 的实现.YOLOV3 基于OpenCV DNN 的目标检测实现 - AIUAITensorFlow 目标检测模型转换为 OpenCV DNN 可调用格式 - AIUAI1. Faster RCNN 模型下载直接从 OpenCV DNN 提供的模型 weights 文件和 config 文件链接下载：ModelVersion Faster-RCNN Inception v22018_01_28weightsconfigFaster-RCNN ResNet-502018_01_28weightsconfig或者，根据 TensorFlow 目标检测模型转换为 OpenCV DNN 可调用格式 - AIUAI 中的说明，自己进行模型转化. 如果是基于 TensorFlow 对定制数据集训练的模型，则采用这种方法.这里以 faster_rcnn_resnet50_coco_2018_01_28 模型为例，手工得到 graph.pbtxt 文件，进行测试.2. Faster RCNN DNN 实现之一#!/usr/bin/python #!--*-- coding:utf-8 --*-- import cv2 import matplotlib.pyplot as plt pb_file = '/path/to/faster_rcnn_resnet50_coco_2018_01_28/frozen_inference_graph.pb' pbtxt_file = '/path/to/faster_rcnn_resnet50_coco_2018_01_28/graph.pbtxt' net = cv2.dnn.readNetFromTensorflow(pb_file, pbtxt_file) score_threshold = 0.3 img_file = "test.jpg" img_cv2 = cv2.imread(img_file) height, width, _ = img_cv2.shape net.setInput(cv2.dnn.blobFromImage(img_cv2, size=(300, 300), swapRB=True, crop=False)) out = net.forward() print(out) for detection in out[0, 0, :,:]: score = float(detection[2]) if score > score_threshold: left = detection[3] * width top = detection[4] * height right = detection[5] * width bottom = detection[6] * height cv2.rectangle(img_cv2, (int(left), int(top)), (int(right), int(bottom)), (23, 230, 210), thickness=2) t, _ = net.getPerfProfile() label = 'Inference time: %.2f ms' % \ (t * 1000.0 / cv2.getTickFrequency()) cv2.putText(img_cv2, label, (0, 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 255)) plt.figure(figsize=(10, 8)) plt.imshow(img_cv2[:, :, ::-1]) plt.title("OpenCV DNN Faster RCNN-ResNet50") plt.axis("off") plt.show()3. Faster RCNN DNN 实现之二#!/usr/bin/python3 # -*- coding: utf-8 -*- import cv2 import os import matplotlib.pyplot as plt import time class general_faster_rcnn(object): def __init__(self, modelpath): self.conf_threshold = 0.3 # Confidence threshold self.nms_threshold = 0.4 # Non-maximum suppression threshold self.net_width = 4…

TensorFlow 目标检测模型转换为 OpenCV DNN 可调用格式
type: item
date: 2019-04-02T01:40:00+00:00
description: 在 OpenCV4.X 版本(OpenCV3.4.1之后版本) 可以采用 cv2.dnn.readNetFromTensorflow(pbmodel, pbtxt) 函数直接调用 TensorFlow 训练的目标检测模型.1. TensorFlow Detection Model ZooTensorFlow 目标检测预训练模型：Tensorflow Detection Model Zoo1.1. 基于 COCO 数据训练的模型Model nameSpeed (ms)COCO mAP1Outputsssd_mobilenet_v1_coco3021Boxesssd_mobilenet_v1_0.75_depth_coco ☆2618Boxesssd_mobilenet_v1_quantized_coco ☆2918Boxesssd_mobilenet_v1_0.75_depth_quantized_coco ☆2916Boxesssd_mobilenet_v1_ppn_coco ☆2620Boxesssd_mobilenet_v1_fpn_coco ☆5632Boxesssd_resnet_50_fpn_coco ☆7635Boxesssd_mobilenet_v2_coco3122Boxesssd_mobilenet_v2_quantized_coco2922Boxesssdlite_mobilenet_v2_coco2722Boxesssd_inception_v2_coco4224Boxesfaster_rcnn_inception_v2_coco5828Boxesfaster_rcnn_resnet50_coco8930Boxesfaster_rcnn_resnet50_lowproposals_coco64 Boxesrfcn_resnet101_coco9230Boxesfaster_rcnn_resnet101_coco10632Boxesfaster_rcnn_resnet101_lowproposals_coco82 Boxesfaster_rcnn_inception_resnet_v2_atrous_coco62037Boxesfaster_rcnn_inception_resnet_v2_atrous_lowproposals_coco241 Boxesfaster_rcnn_nas183343Boxesfaster_rcnn_nas_lowproposals_coco540 Boxesmask_rcnn_inception_resnet_v2_atrous_coco77136Masksmask_rcnn_inception_v2_coco7925Masksmask_rcnn_resnet101_atrous_coco47033Masksmask_rcnn_resnet50_atrous_coco34329Masks注:[1] - 带五角星符号(☆) 表示模型支持 TPU 训练.[2] - 下载 quantized 模型的 .tar.gz 文件并解压后，会得到不同的文件，包括：checkpoint 文件，config 配置文件和 tfile frozen graphs(txt/binary)文件.1.2. 基于 Kitti 数据集训练的模型Model nameSpeed (ms)Pascal mAP@0.5Outputsfaster_rcnn_resnet101_kitti7987Boxes1.3. 基于 Open Images 数据集训练的模型Model nameSpeed (ms)Open Images mAP@0.52Outputsfaster_rcnn_inception_resnet_v2_atrous_oidv272737Boxesfaster_rcnn_inception_resnet_v2_atrous_lowproposals_oidv2347 Boxesfacessd_mobilenet_v2_quantized_open_image_v4 32073 (faces)BoxesModel nameSpeed (ms)Open Images mAP@0.54Outputsfaster_rcnn_inception_resnet_v2_atrous_oidv442554Boxesssd_mobilenetv2_oidv48936Boxesssd_resnet_101_fpn_oidv423738Boxes1.4. 基于 iNaturalist Species 数据集训练的模型Model nameSpeed (ms)Pascal mAP@0.5Outputsfaster_rcnn_resne…

OpenPose 基于OpenCV DNN 的多人姿态估计
type: item
date: 2019-03-20T10:00:00+00:00
description: OpenPose 可以对图片中单个人体目标的姿态估计，也可以处理图片中多人的姿态估计.OpenPose 基于OpenCV DNN 的单人姿态估计 - AIUAI这里主要记录基于 OpenCV 4.x DNN 模块和 OpenPose 开源模型的多人人体姿态估计 的实现.采用的模型的基于 COCO 数据集训练的人体关键点模型.1. OpenPose 网络结构OpenPose 的多人人体姿态估计的模型结构如图：网络输入为 hxwx3 的图片，并输出包含关键点(Keypoints)的置信图(confidence maps) 和每个关键点对(keypoint pair) 的 Part Affinity Heatmaps 的两个输出数组.[1] - Stage 0:采用 VGGNet 的前 10 层，提取输入图片的特征图(feature maps).[2] - Stage 1:采用 2-分支的 multi-stage CNN 网络结构：(1) - 分支一：网络分支一预测人体关键点位置的 2D Confidence Maps ，如 elbow, knee, etc. 每个 Confidence Map 是一个灰度图(grayscale image)，其最大值的位置坐标即为对应人体某个关键点的概率最高. 如图：(2) - 分支二：网络分支二预测 Part Affinities (PAF) 的2D 向量场(L, vector fields)，其表示了两个关键点之间关联度(degree of association). 例如，关键点 Neck 和 Left Shoulder 之间的 Part Affinity, 如下图，属于同一个人体的关键点之间的 Affinity 值比较大.总体来说，Confidence Maps 用于检测关键点位置；而 Affinity Maps 用于检测关键点之间的有效连接.2. OpenPose 的 OpenCV DNN 实现根据检测过程，主要涉及的函数有：getKeyponts() 、 getValidPairs() 和 getPersonwiseKeypoints() .2.1. 模型加载#!/usr/bin/python3 #!--*-- coding: utf-8 --*-- import cv2 import time import numpy as np import matplotlib.pyplot as plt num_points = 18 keypointsMapping = ['Nose', 'Neck', 'R-Sho', 'R-Elb', 'R-Wr', 'L-Sho', 'L-Elb', 'L-Wr', 'R-Hip', 'R-Knee', 'R-Ank', 'L-Hip', 'L-Knee', 'L-Ank', 'R-Eye', 'L-Eye', 'R-Ear', 'L-Ear'] POSE_PAIRS = [[1,2], [1,5], [2,3], [3,4], [5,6], [6,7], [1,8], [8,9], [9,10], [1,11], [11,12], [12,13], [1,0], [0,14], [14,16], [0,15], [15,17], [2,17], [5,16] ] # index of pafs correspoding to the POSE_PAIRS # e.g for POSE_PAIR(1,2), the PAFs are located at indices (31,32) of output, Similarly, (1,5) -> (39,40) and so on. mapIdx = [[31,32], [39,40], [33,34], [35,36], [41,42], [43,44], [19,20], [21,22], [23,24], [25,26], [27,28], [29,30], [47,48], [49,50], [53,54], [51,52], [55,56], [37,38], [45,46]] colors = [[0,100,255], [0,100,255], [0,255,255], [0,100,255], [0,255,255], [0,100,255], [0,255,0], [255,200,100], [255,0,255], [0,255,0], [255,200,100], [255,0,255], [0,0,255], [255,0,0], [200,200,0], [255,0,0], [200,200,0], [0,0,0]] # dnn 加载模型 start = time.tim…

OpenPose 基于OpenCV DNN 的单人姿态估计
type: item
date: 2019-03-20T05:10:00+00:00
description: OpenCV4.0 版本以后可以直接读取 Caffe、TensorFlow、ONNX 等模型的 API，直接采用OpenCV 的 DNN 模块即可.这里主要测试下基于 DNN 模块和 OpenPose 模型的单人人体姿态估计的具体实现.Github 项目 - OpenPose 关键点输出格式 - AIUAIGithub 项目 - OpenPose Python API - AIUAIGithub 项目 - OpenPose 模型与Demos - AIUAIOpenPose 人体姿态模型下载路径：BODY25: http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/body_25/pose_iter_584000.caffemodel COCO: http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/coco/pose_iter_440000.caffemodel MPI: http://posefs1.perception.cs.cmu.edu/OpenPose/models/pose/mpi/pose_iter_160000.caffemodel具体完整代码为：#!/usr/bin/python3 #!--*-- coding: utf-8 --*-- from __future__ import division import cv2 import time import numpy as np import matplotlib.pyplot as plt import os class general_pose_model(object): def __init__(self, modelpath, mode="BODY25"): # 指定采用的模型 # Body25: 25 points # COCO: 18 points # MPI: 15 points self.inWidth = 368 self.inHeight = 368 self.threshold = 0.1 if mode == "BODY25": self.pose_net = self.general_body25_model(modelpath) elif mode == "COCO": self.pose_net = self.general_coco_model(modelpath) elif mode == "MPI": self.pose_net = self.get_mpi_model(modelpath) def get_mpi_model(self, modelpath): self.points_name = { "Head": 0, "Neck": 1, "RShoulder": 2, "RElbow": 3, "RWrist": 4, "LShoulder": 5, "LElbow": 6, "LWrist": 7, "RHip": 8, "RKnee": 9, "RAnkle": 10, "LHip": 11, "LKnee": 12, "LAnkle": 13, "Chest": 14, "Background": 15 } self.num_points = 15 self.point_pairs = [[0, 1], [1, 2], [2, 3], [3, 4], [1, 5], [5, 6], [6, 7], [1, 14],[14, 8], [8, 9], [9, 10], [14, 11], [11, 12], [12, 13] ] prototxt = os.path.join( modelpath, "pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt") caffemodel = os.path.join( modelpath, "pose/mpi/pose_iter_160000.caffemodel") mpi_model = cv2.dnn.readNetFromCaffe(prototxt, caffemodel) return mpi_model def general_coco_model(self, modelpath): self.points_name = { "Nose": 0, "Neck": 1, "RShoulder": 2, "RElbow": 3, "RWrist": 4, "LShoulder": 5, "LElbow": 6, "LWrist": 7, "RHip": 8, "RKnee": 9…

OpenCV4.X - DNN模块 Python APIs
type: item
date: 2019-03-18T13:48:00+00:00
description: OpenCV 4.X 版本集成了很多直接利用 DNN 模块的 Python API 接口.安装：sudo pip install opencv-python使用：from cv2 import dnn# Variables with simple values DNN_BACKEND_DEFAULT = 0 DNN_BACKEND_HALIDE = 1 DNN_BACKEND_INFERENCE_ENGINE = 2 DNN_BACKEND_OPENCV = 3 DNN_BACKEND_VKCOM = 4 DNN_TARGET_CPU = 0 DNN_TARGET_MYRIAD = 3 DNN_TARGET_OPENCL = 1 DNN_TARGET_OPENCL_FP16 = 2 DNN_TARGET_VULKAN = 4 __loader__ = None __spec__ = None1. dnn.blobFromImage定义：def blobFromImage(image, scalefactor=None, size=None, mean=None, swapRB=None, crop=None, ddepth=None): pass作用：根据输入图像，创建 NCHW 次序的 4-dim blobs.参数：[1] - image: cv2.imread 读取的图片数据；[2] - scalefactor: 缩放像素值，如 [0, 255] - [0, 1].[3] - size: 输出图像的尺寸，如 (netInWidth, netInHeight).[4] - mean: 从各通道减均值. 如果输入 image 为 BGR 次序，且swapRB=True，则通道次序为 (mean-R, mean-G, mean-B).[5] - swapRB: 交换 3 通道图片的第一个和最后一个通道，如 BGR - RGB. [6] - crop: 图像尺寸 resize 后是否裁剪. 如果crop=True，则，输入图片的尺寸调整resize后，一个边对应与 size 的一个维度，而另一个边的值大于等于 size 的另一个维度；然后从 resize 后的图片中心进行 crop. 如果crop=False，则无需 crop，只需保持图片的长宽比.[7] - ddepth: 输出 blob 的 Depth. 可选: CV_32F 或 CV_8U.示例：import cv2 from cv2 import dnn import numpy as np import matplotlib.pyplot as plt img_cv2 = cv2.imread("test.jpg") print("[INFO]Image shape: ", img_cv2.shape) inWidth = 256 inHeight = 256 outBlob1 = cv2.dnn.blobFromImage(img_cv2, scalefactor=1.0 / 255, size=(inWidth, inHeight), mean=(0, 0, 0), swapRB=False, crop=False) print("[INFO]outBlob1 shape: ", outBlob1.shape) outimg1 = np.transpose(outBlob1[0], (1, 2, 0)) outBlob2 = cv2.dnn.blobFromImage(img_cv2, scalefactor=1.0 / 255, size=(inWidth, inHeight), mean=(0, 0, 0), swapRB=False, crop=True) print("[INFO]outBlob2 shape: ", outBlob2.shape) outimg2 = np.transpose(outBlob2[0], (1, 2, 0)) plt.figure(figsize=[10, 10]) plt.subplot(1, 3, 1) plt.title('Input image', fontsize=16) plt.imshow(cv2.cvtColor(img_cv2, cv2.COLOR_BGR2RGB)) plt.axis("off") plt.subplot(1, 3, 2) plt.title('Output image - no crop', fontsize=16) plt.imshow(cv2.cvtColor(outimg1, cv2.COLOR_BGR2RGB)) plt.axis("off") plt.subplot(1, 3, …

Ubuntu - OpenCV 源码安装与测试
type: item
date: 2019-01-03T09:04:00+00:00
description: Ubuntu16.04 中，OpenCV 多版本的升级与安装.1. OpenCV 编译安装1.1. 查看 Ubuntu 当前的 OpenCV 版本pkg-config --modversion opencv # 2.4.9.1在 /usr/bin 和 /usr/include路径里包含了默认 OpenCV 版本的相关文件.1.2. 依赖库安装[1] - 官方必须依赖库sudo apt-get update sudo apt-get install cmake git sudo apt-get install build-essential \ libgtk2.0-dev \ pkg-config \ libavcodec-dev \ libavformat-dev [2] - 官方建议依赖库sudo apt-get install python-dev \ libtbb2 \ libtbb-dev \ libjpeg-dev \ libpng-dev \ libtiff-dev \ libjasper-dev \ libdc1394-22-dev[3] - OPENGL 支持依赖库sudo apt-get install freeglut3-dev \ mesa-common-dev \ libgtkglext1 \ libgtkglext1-dev[4] - 视频解码支持依赖库sudo apt-get install checkinstall \ yasm \ libgstreamer0.10-dev \ libgstreamer-plugins-base0.10-dev \ libv4l-dev \ libtbb-dev \ libqt4-dev \ libgtk2.0-dev \ libmp3lame-dev \ libtheora-dev \ libvorbis-dev \ libxvidcore-dev \ x264 \ v4l-utils[5] - 其它可能依赖项sudo apt-get install libgphoto2-dev \ libavresample-dev \ liblapacke-dev \ gtk+-3.0 \ libgtk-3-dev \ libeigen3-dev \ tesseract-ocr \ liblept5 \ leptonica-progs \ libleptonica-dev 1.3. OpenCV 源码下载下载路径：https://github.com/opencv/opencv/releases1.4. OpenCV 3.4 编译安装假设路径为 ROOT_DIR = /opt/opencv3.4/cd $ROOT_DIR mkdir build cd build cmake -D CMAKE_BUILD_TYPE=RELEASE \ -D CMAKE_INSTALL_PREFIX=/usr/local/opencv34 .. # cmake -D WITH_TBB=ON # -D BUILD_NEW_PYTHON_SUPPORT=ON \ # -D WITH_V4L=ON \ # -D INSTALL_C_EXAMPLES=ON \ # -D INSTALL_PYTHON_EXAMPLES=ON \ # -D BUILD_EXAMPLES=ON \ # -D WITH_QT=ON \ # -D WITH_OPENGL=ON .. make -j4 sudo make install在编译安装时，ippicv 库的下载文件 - ippicv_2019_lnx_intel64_general_20180723.tgz 速度特别慢.因此，采用离线下载文件，再进行编译.ippicv_2019_lnx_intel64_general_20180723.tgz 文件下载：百度网盘链接: https://pan.baidu.com/s/1mVTSdn6hTgo8P3ASKauyDg 提取码: hiux假设 ippicv_2019_lnx_intel64_general_20180723.tgz放置于 ROOT_DIR/3rdparty/ippicv/ 路径，并修改 ROOT_DIR/3rdparty/ippicv/ippicv.cmake 文件(47 行)：修改前：41 set(THE_ROOT "${OpenCV_BINARY_DIR}/3rdparty/ippicv") 42 ocv_download(FILENAME ${OPENCV_ICV_NAME} 43 HASH ${OPENCV_ICV_HASH} 44 URL 45 "${OPENCV_IPPICV_URL}" 46 "…