【持续更新】 | OpenCV 学习笔记
本文地址:http://www.cnblogs.com/QingHuan/p/7365732.html,转载请注明出处
###############################################################################
OpenCV的入门书籍有很多,这里选择的是《OpenCV 3计算机视觉-Python语言实现-第二版》
所有书上的源代码:https://github.com/techfort/pycv
安装过程请查看我的另一篇博客:
http://www.cnblogs.com/QingHuan/p/7354074.html
###############################################################################
第2章 处理文件、摄像头和图形用户界面
2.1 基本I/O脚本
2.1.5 捕获摄像头的帧
下面的代码实现了捕获摄像头10秒的视频信息,并将其写入一个AVI文件中
import cv2 cameraCapture = cv2.VideoCapture(0)
fps = 30
size = (int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter(
'MyOutputVid.avi', cv2.VideoWriter_fourcc('I', '', '', ''),
fps, size) success, frame = cameraCapture.read()
numFrameRemaining = 10*fps - 1
while success and numFrameRemaining > 0:
videoWriter.write(frame)
success, frame = cameraCapture.read()
numFrameRemaining -= 1 cameraCapture.release()
2.1.6 在窗口显示图像
一般情况下使用imshow()来显示图片,图片会闪一下然后消失,下面代码可以是图片一直显示
import cv2
import numpy img = cv2.imread("data/aero1.jpg")
cv2.imshow('Test Image', img)
cv2.waitKey()
cv2.destroyAllWindows()
虽然左上角没有关闭按钮,但是随便按一个按键,都会将其关闭
2.1.7 实时显示摄像头的内容
import cv2
import numpy clicked = False
def onMouse(event, x, y, flags, param):
global clicked
if event == cv2.EVENT_FLAG_LBUTTON:
clicked = True cameraCapture = cv2.VideoCapture(0)
cv2.namedWindow('MyWindow')
cv2.setMouseCallback('MyWindow', onMouse) print 'Show camera feed. Click window or press any key to stop' success, frame = cameraCapture.read()
while success and cv2.waitKey(1) == -1 and not clicked:
cv2.imshow('MyWindow', frame)
success, frame = cameraCapture.read() cv2.destroyWindow('MyWindow')
cameraCapture.release()
setMouseCallback可以获取鼠标的输入
namedWindow()用来创建窗口
imshow()用来显示窗口
destroyWindow()用来销毁窗口
cameraCapture.release()用来释放摄像头
cv2.waitKey(1) == -1 :
参数为等待键盘触发的时间,返回值-1表示没有按键被按下
OpenCV不能处理窗口,当单击窗口的关闭按钮时,并不能将其关闭
2.3 一个小程序—— Cameo——面向对象的设计
2.3.1 使用 managers.CaptureManager 提取视频流
这里中文版讲的不太通顺,建议看看英文原版
# CaptureManager 高级I/O流接口 import cv2
import numpy
import time # 初始化CaptureManager类 class CaptureManager(object): def __init__(self, capture, previewWindowManager = None,
shouldMirrorPreview = False): # 更新:前面有下划线的是非公有变量,主要与当前帧的状态与文件写入操作有关
# self 类似于结构体,里面有很多变量,下面是在初始化这些变量
# 类比于C++ 中学的"类"来比较
self.previewWindowManager = previewWindowManager
self.shouldMirrorPreview = shouldMirrorPreview self._capture = capture
self._channel = 0
self._enteredFrame = False
self._frame = None
self._imageFilename = None
self._videoFilename = None
self._videoEncoding = None
self._videoWriter = None self._startTime = None
self._frameElapsed = long(0)
self._fpsEstimate = None # @ 符号的解释参见:http://gohom.win/2015/10/25/pyDecorator/
@property
def channel(self):
return self._channel @channel.setter
def channel(self, value):
if self._channel != value
self._channel = value
self._frame = None @property
def frame(self):
if self._enteredFrame and self._frame is None:
_, self._frame = self._capture.retrieve()
return self._frame @property
def isWritingImage (self):
return self._imageFilename is not None @property
def isWrtingVideo(self):
return self._videoFilename is not None def enterFrame(self):
"""Capture the next frame, if any"""
暂停在书Page 30
代码暂时写到这里,因为这里根本不认真讲原理,就是简单的堆砌代码,
感觉学习不到知识,所以就不看了,跳到下一章
第3章 使用OpenCV 3 处理图像
3.2 傅立叶变换
下面是一个高通滤波器和低通滤波器的例子:注意看注释,写的很详细
import cv2
import numpy as np
from scipy import ndimage # kernel defined by ourself
kernel_3x3 = np.array([[-1, -1, -1],
[-1, 8, -1],
[-1, -1, -1]]) kernel_5x5 = np.array([[-1, -1, -1, -1, -1],
[-1, 1, 2, 1, -1],
[-1, 2, 4, 2, -1],
[-1, 1, 2, 1, -1],
[-1, -1, -1, -1, -1]]) # http://docs.opencv.org/3.1.0/d4/da8/group__imgcodecs.html
# in func "imread", 0 means trans to gray image
img = cv2.imread("data/lena.jpg", 0) k3 = ndimage.convolve(img, kernel_3x3)
k5 = ndimage.convolve(img, kernel_5x5) """Gaussian kernel: The function convolves the source image
with the specified Gaussian kernel. GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst @param ksize Gaussian kernel size. ksize.width and ksize.height can differ but they both must be
. positive and odd. Or, they can be zero's and then they are computed from sigma.
@param sigmaX Gaussian kernel standard deviation in X direction.""" # here is a per-defined Gaussian Blur and the
# kernel is set to 11x11, start in X axis direction
# Attention: GaussianBlur is a low pass filter but the above two are high pass filters
# after minus with the origin image, finally equivalent to a high pass filter
blurred = cv2.GaussianBlur(img, (11, 11), 0)
g_hpf = img - blurred cv2.imshow("3x3", k3)
cv2.imshow("5x5", k5)
cv2.imshow("g_hpf", g_hpf)
cv2.waitKey()
cv2.destroyAllWindows()
可以看一下处理效果:
原图:
高通滤波器:
3x3 kernel:
5x5 kernel:
用低通滤波器处理后的图片,与原图相减,得到高通滤波器的效果:(原理待查)
可以发现第三张图的效果最好
中间都跳过去了,书上讲的不好,所以只是大概看了一遍没有敲代码
读完这本书一定要换一本再补充一下
3.7 Canny 边缘检测
Canny函数可以非常方便的识别出边缘,
例子如下:
import cv2
import numpy as np
import filters
from scipy import ndimage img = cv2.imread("data/lena.jpg", 0)
cv2.imwrite("lena_edge.jpg", cv2.Canny(img, 200, 300)) cv2.imshow("lena", cv2.imread("lena_edge.jpg"))
cv2.waitKey()
cv2.destroyAllWindows()
lena_edge.jpg:
3.8 简单的轮廓检测
首先创建了一个黑色图像,然后在中间放了一个白色方块。然后对方块寻找轮廓并把轮廓标注出来
(其实没有看懂代码)
# -*- coding: utf-8 -*
import cv2
import numpy as np
import filters
from scipy import ndimage # dark, blank image
img = np.zeros((200, 200), dtype=np.uint8)
# assign the middle square white
img[50:150, 50:150] = 255 # 二值化
ret, thresh = cv2.threshold(img, 127, 255, 0) image, contours, hierarchy = cv2.findContours(thresh,
cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
color = cv2.cvtColor(image, cv2.COLOR_GRAY2BGR) img = cv2.drawContours(color, contours, -1, (0, 255, 0), 2) cv2.imshow("contours", color)
cv2.waitKey()
cv2.destroyAllWindows()
结果:
3.9 找到一个图形的边界框、最小矩形区域和最小闭圆的轮廓
# -*- coding: utf-8 -*
import cv2
import numpy as np img = cv2.pyrDown(cv2.imread("pycv-master/chapter3/hammer.jpg", cv2.IMREAD_UNCHANGED)) ret, thresh = cv2.threshold(cv2.cvtColor(img.copy(), cv2.COLOR_BGR2GRAY) , 127, 255, cv2.THRESH_BINARY)
image, contours, hier = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for c in contours:
# find bounding box coordinates
x,y,w,h = cv2.boundingRect(c) # 画一个正方形
cv2.rectangle(img, (x,y), (x+w, y+h), (0, 255, 0), 2) # 画最贴近的正方形,有一定的旋转
# find minimum area
rect = cv2.minAreaRect(c)
# calculate coordinates of the minimum area rectangle
box = cv2.boxPoints(rect)
# normalize coordinates to integers
box = np.int0(box)
# draw contours
cv2.drawContours(img, [box], 0, (0,0, 255), 3) # 画一个圆正好包裹住
# calculate center and radius of minimum enclosing circle
(x,y),radius = cv2.minEnclosingCircle(c)
# cast to integers
center = (int(x),int(y))
radius = int(radius)
# draw the circle
img = cv2.circle(img,center,radius,(0,255,0),2) cv2.drawContours(img, contours, -1, (255, 0, 0), 1)
cv2.imshow("contours", img) cv2.waitKey()
cv2.destroyAllWindows() cv2.imwrite("hammer_contours.jpg", img)
结果:
【持续更新】 | OpenCV 学习笔记的更多相关文章
- (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU
首页 视界智尚 算法技术 每日技术 来打我呀 注册 OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...
- OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波
http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...
- OpenCV 学习笔记 07 目标检测与识别
目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...
- OpenCV学习笔记3
OpenCV学习笔记3 图像平滑(低通滤波) 使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音,边界).所以边界也会被模糊一点.(当然,也有一些模 ...
- opencv学习笔记(七)SVM+HOG
opencv学习笔记(七)SVM+HOG 一.简介 方向梯度直方图(Histogram of Oriented Gradient,HOG)特征是一种在计算机视觉和图像处理中用来进行物体检测的特征描述子 ...
- opencv学习笔记(六)直方图比较图片相似度
opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...
- opencv学习笔记(五)镜像对称
opencv学习笔记(五)镜像对称 设图像的宽度为width,长度为height.(x,y)为变换后的坐标,(x0,y0)为原图像的坐标. 水平镜像变换: 代码实现: #include <ios ...
- opencv学习笔记(四)投影
opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...
- opencv学习笔记(三)基本数据类型
opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...
- opencv学习笔记(二)寻找轮廓
opencv学习笔记(二)寻找轮廓 opencv中使用findContours函数来查找轮廓,这个函数的原型为: void findContours(InputOutputArray image, O ...
随机推荐
- SQLServer “无法对数据库'XX' 执行删除,因为它正用于复制”的解决方法
修改数据库某个字段的长度时出现: “无法修改表.无法对 表'dbo.N_Client_content' 执行 删除,因为它正用于复制.” 不能直接对该数据库进行操作,通过alter 的办法来修改,问题 ...
- 编码原则 之 Persistence Ignorance
原文 The principle of Persistence Ignorance (PI) holds that classes modeling the business domain in a ...
- 4、zabbix基本配置入门
Zabbix监控流程: Host group --> Hosts(向server端添加被监控主机) --> Application(在agent定义) --> Items(在appl ...
- 4th,Python三级菜单
1. 运行程序输出第一级菜单 2. 选择一级菜单某项,输出二级菜单,同理输出三级菜单 3. 菜单数据保存在文件中 4. 让用户选择是否要退出 5. 有返回上一级菜单的功能 data = { '北京': ...
- 转 ObjExporter Unity3d导出场景地图寻路
http://wiki.unity3d.com/index.php?title=ObjExporter
- EPEL源-是什么全称
EPEL源 EPEL (Extra Packages for Enterprise Linux)是基于Fedora的一个项目,为“红帽系”的操作系统提供额外的软件包,适用于RHEL.CentOS和 ...
- caffe-windows画loss与accuracy曲线
参考博客: http://blog.csdn.net/sunshine_in_moon/article/details/53541573 进入tools/extra/文件夹中,修改plot_train ...
- 以太坊钱包开发系列2 - 账号Keystore文件导入导出
以太坊去中心化网页钱包开发系列,将从零开始开发出一个可以实际使用的钱包,本系列文章是理论与实战相结合,一共有四篇:创建钱包账号.账号Keystore文件导入导出.展示钱包信息及发起签名交易.发送Tok ...
- android -------- Retrofit + RxJava2.0 + Kotlin + MVP 开发的 WanAndroid 项目
简介 wanandroid项目基于 Retrofit + RxJava2.0 + Kotlin + MVP 用到的依赖 implementation 'io.reactivex.rxjava2:rxj ...
- postman设置token关联参数,其他接口直接读取token变量
问题描述:有一个登录接口获取token,其他接口再次访问时都要带上token 解决方案: 步骤一:在登录接口访问后设置postman的环境变量,例如设置环境变量名:token,值为登录接口访问成功后, ...