树莓派python opencv教程_树莓派 OpenCV_Python基础教程---11-21(深度学习部分没有弄)...

【生肉】【opencv-python】OpenCV with Python for Image and Video Analysis_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili​www.bilibili.com

第十一节:Template Matching(模板匹配)

功能:模板匹配

# Template Matching

# 功能:模板匹配

import cv2

import numpy as np

img_bgr = cv2.imread('opencv-tutorial.jpg')#读取待匹配的图像

img_gray = cv2.cvtColor(img_bgr, cv2.COLOR_BGR2GRAY)#转为灰度图

template = cv2.imread('opencv-matching.jpg',0)#读取用于匹配的图像,并转为灰度图

# 取值0,将图像转化为灰图;

# 取值2,原深度图像;

# 取值4,原颜色图像;

#记录图像模板的尺寸

w, h = template.shape[::-1]#涉及的数字倒叙输出

#TM_CCOEFF_NORMED是标准相关性系数匹配,matchtemplate常用方法

res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)

#设定阈值,数值越低,匹配精度越低,数量越多

threshold = 0.8

#输出res>阈值 的像素坐标

loc = np.where(res >= threshold)

#使用灰度图像中的坐标对原始BGR图像进行标记

for pt in zip(*loc[::-1]):

cv2.rectangle(img_bgr, pt, (pt[0]+w, pt[1]+h), (0,255,255), 2)

cv2.imshow('detect', img_bgr)

cv2.imshow('img_gray', img_gray)

cv2.imshow('template ', template )

cv2.waitKey(0)

cv2.destroyAllWindows()

输出结果:

参考链接:

(1)python[::-1]的用法讲解

# [m : ] 代表列表中的第m+1项到最后一项

# [ : n] 代表列表中的第一项到第n项

import numpy as np

a=[1,2,3.4,5]

print(a)

[ 1 2 3 4 5 ]

print(a[-1]) 取最后一个元素

结果:[5]

print(a[:-1]) 除了最后一个取全部

结果:[ 1 2 3 4 ]

print(a[::-1]) 取从后向前(相反)的元素

结果:[ 5 4 3 2 1 ]

print(a[2::-1]) 取从下标为2的元素翻转读取

结果:[ 3 2 1 ]

print(a[1:]) 取第二个到最后一个元素

结果:[2 3 4 5]Python中[ : n]、[m : ]、[-1]、[:-1]、[::-1]、[2::-1]和[1:]的含义​blog.csdn.net

(2)Match的详细讲解使用Python+OpenCV进行图像模板匹配(Match Template)​blog.csdn.net

第十二节:GrabCut Foreground Extraction(图像分割、前景提取)

功能:图像分割、前景提取

# GrabCut Foreground Extraction

# 功能:图像分割、前景提取

import cv2

import numpy as np

import matplotlib.pyplot as plt

# Step1. 加载图像

img = cv2.imread('messi.jpg')#读取待匹配的图像

# Step2. 创建掩模、背景图和前景图

mask = np.zeros(img.shape[:2], np.uint8)# 创建大小相同的掩模

bgdModel = np.zeros((1,65), np.float64)# 创建背景图像

fgdModel = np.zeros((1,65), np.float64)# 创建前景图像

# Step3. 初始化矩形区域

# 这个矩形必须完全包含前景(相当于这里的梅西)

rect = (50, 50, 450, 290)

# Step4. GrubCut算法,迭代5次

# mask的取值为0,1,2,3

cv2.grabCut(img, mask, rect, bgdModel, fgdModel,5, cv2.GC_INIT_WITH_RECT)# 迭代5次

# Step5. mask中,值为2和0的统一转化为0, 1和3转化为1

mask2 = np.where((mask==0), 0, 1).astype('uint8')

# np.newaxis 插入一个新维度,相当于将二维矩阵扩充为三维

img = img*mask2[:,:,np.newaxis]

plt.imshow(img)

plt.colorbar()

plt.show()

cv2.waitKey(0)

cv2.destroyAllWindows()

输出结果:

参考链接:

(1)cv2.grabCut函数参数详解JimmyHua:OpenCV图像处理-均值漂移&Grabcut分割​zhuanlan.zhihu.com

函数

cv2.grabCut(img, mask, rect,

bgdModel, fgdModel,

iterCount, mode = GC_EVAL)

其中:

img --> 输入的三通道图像;

mask --> 输入的单通道图像,初始化方式为GC_INIT_WITH_RECT表示ROI区域可以被初始化为:

GC_BGD --> 定义为明显的背景像素 0

GC_FGD --> 定义为明显的前景像素 1

GC_PR_BGD --> 定义为可能的背景像素 2

GC_PR_FGD --> 定义为可能的前景像素 3

rect --> 表示roi区域;

bgdModel --> 表示临时背景模型数组;

fgdModel --> 表示临时前景模型数组;

iterCount --> 表示图割算法迭代次数, 次数越多,效果越好;

mode --> 当使用用户提供的roi时候使用GC_INIT_WITH_RECT。

(2)代码讲解:OpenCV自学笔记6. 图像分割​blog.csdn.net

(3)分割原理:Opencv_Grabcut_YZXnuaa的博客-CSDN博客​blog.csdn.net

第十三节:Corner Detection(边角检测)

功能:边角检测

# Corner Detection

# 功能:边角检测

import cv2

import numpy as np

img = cv2.imread('detect.jpg')

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

gray = np.float32(gray)

#角点检测

corners = cv2.goodFeaturesToTrack(gray, 100, 0.01, 10)

corners = np.int0(corners)# int0 等价与int64

for corner in corners:#从corners中取值,进行迭代,每次赋值给corner

x, y = corner.ravel()#将多维数组转为一维数组

cv2.circle(img, (x,y), 3, 255, -1)#在img上画圈圈

cv2.imshow('Corner',img)

cv2.waitKey(0)

cv2.destroyAllWindows()

输出结果:

参考链接:

(1)cv2.goodFeaturesToTrack函数https://jingyan.baidu.com/article/2c8c281d9d8e7f0008252a88.html​jingyan.baidu.com

第十四节:Feature Matching(Homography)Brute Force

功能:特征匹配(有点难,没看懂,以后用到再看)

# Feature Matching(Homography)Brute Force

# 功能:特征匹配

import cv2

import numpy as np

import matplotlib.pyplot as plt

img1 = cv2.imread('matching-template',0)

img2 = cv2.imread('matching-image.jpg',0)

orb = cv2.ORB_create()

kp1, des1 = orb.detectAndCompute(img1,None)

kp2, des2 = orb.detectAndCompute(img2,None)

bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck = True)

matches = bf.match(des1, des2)

matches = bf.match(des1, des2)

matches = sorted(matches, key = lambda x:x.distance)

#创建描述符的匹配,然后根据它们的距离对它们排序。

#设置前10个匹配的输出

img3 = cv2.drawMatches(img1,kp1,img2,kp2,matches[:10],None,flags=2)

plt.imshow(img3)

plt.show()

cv2.waitKey(0)

cv2.destroyAllWindows()

输出结果:

参考链接:

(1)cv2.ORB_create()函数用法在opencv3中使用ORB进行特征提取实验-Python版​www.jianshu.com

第十五节:MOG Background Reduction(MOG背景减弱)

功能:通过检测运动来减弱图像的背景

# MOG Background Reduction

# 功能:通过检测运动来减弱图像的背景

import cv2

import numpy as np

cap = cv2.VideoCapture('people-walking.mp4')

fgbg = cv2.createBackgroundSubtractorMOG2()#动态目标检测

while True:

ret, frame = cap.read()

fgmask = fgbg.apply(frame)

cv2.imshow('original', frame)

cv2.imshow('fg', fgmask)

k = cv2.waitKey(30) & 0xff

if k == 27:

break

cap.release()

cv2.destroyAllWindows()

输出结果:(请主动忽略进度条和鼠标的干扰)

参考链接:

(1)createBackgroundSubtractorMOG2()方法opencv中BackgroundSubtractorMOG2源码分析与原理讲解_On my way-CSDN博客​blog.csdn.net

第十六节:Haar Cascade Object Detection Face & Eye(Haar Cascade面部检测)

功能:

# Haar Cascade Object Detection Face & Eye

# 功能:面部检测

import cv2

import numpy as np

#导入库内容

face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml')

cap = cv2.VideoCapture(0)

while True:

ret, img = cap.read()

gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

faces = face_cascade.detectMultiScale(gray, 1.3, 5)

#先检测面部

for (x,y,w,h) in faces:

cv2.rectangle(img, (x,y), (x+w, y+h), (255,0,0), 2)

roi_gray = gray[y:y+h, x:x+w]

roi_color = img[y:y+h, x:x+w]

eyes = eye_cascade.detectMultiScale(roi_gray)

#再检测眼睛

for (ex,ey,eh) in eyes:

cv2.rectangle(roi_color, (ex, ey), (ex+ew,ey+eh), (0,255,0), 2)

cv2.imshow('img', img)

k = cv2.waitKey(30) & 0xff

if k == 27:

break

cap.release()

cv2.destroyAllWindows()

输出结果:侧脸和歪头无法识别

参考链接:

(1)链接库下载地址:Hadrian-country/opencv​github.com

(2)如何从 GitHub 上下载单个文件夹?(因为实际上只用到两个文件)如何从 GitHub 上下载单个文件夹?​www.zhihu.com

(3)opencv-CascadeClassifier(级联分类器)关于opencv-CascadeClassifier(级联分类器)的初步认识_sazass的博客-CSDN博客​blog.csdn.net

第十七节:Making your own Haar Cascade Intro(创建自己的Haar Cascade)

功能:需要用到深度学习,建议在云端申请服务器,进行学习训练

试着翻译:

如何为自己用于图像和影像的Haar Cascade对象进行分类

步骤:

1、收集“负片”或者“背景”图片

任何图像都行,只要保证你的对象不出现在图片中,收集个几千张

2、手机或创建“正片”图片

收集几千张对象图片,可以根据一个图像,或手动创建他们

3、创建一个正矢量文件,包括对象各个方位角度

这些操作通过OpenCV的命令来完成

4、训练cascade

通过OpenCV的命令来完成

-----------------------------

负片和正片图像需要的描述文件

负片图像:

通常bg.txt文件包含每个图片的路径,每一行一张

示例行:

neg/1.jpg

正片图像:

有时称为“信息”,pso.txt,或类似的名称。包含每个图片的路径,一行一张,一次式对象的个数,对象的位置

示例行:

pos/1.jpg 1 0 0 50 50:图像,数量,开始点,直角坐标系

--------------------------------------------------

如果你准备创建实例而不是收集或标记正片,一般希望负片图像数量大于正片图像数量

尽量使用小图片,负片用100X100,正片用50X50,这样训练时会更小

参考链接:

(2)可以参考TensorFlow教程,更方便理解这一块主要是训练集的选择

第十八节:Gathering Images for Haar Cascade(为Haar Cascade收集图像)

第十九节:Cleaning images and creating description files(清理图像和创建描述文件)

第二十节:Haar Cascade for image & video object classification(图像和影像的Haar Cascade对象进行分类)

第二十一节:Training Haar cascade object detection(训练Haar cascade进行目标检测)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值