腾讯云学生服务器一元购-OpenCV步步精深

腾讯云学生服务器一元购(含续费) :点我

 

腾讯云学生服务器一元购演示图
腾讯云学生服务器一元购演示图

点击长期优惠套餐旁边的那个

限量抢购套餐

就好啦!

 

总结一下所学的Opencv知识

2016.12.23我们学会了如何安装搭建环境;

2016.12.25我们学会了Opencv读入,显示,保存图像。

2016.12.27我们学会了Opencv捕获摄像头视频。

2016.12.29我们学会了Opencv中的绘图函数。

2016.12.30我们学会了Opencv处理鼠标事件。

2017.01.03我们学会了Opencv稍微高级点的鼠标事件。

2017.01.07我们学会了Opencv滑动条做调色盘。

2017.01.09我们学会了Opencv进阶版调色盘。

2017.01.11我们学会了Opencv图像核心基础操作。

2017.01.13我们学会了Opencv图像核心基础操作,拆分合并图像通道。

2017.01.17我们学会了Opencv图像核心基础操作,为图像加边框。

2017.01.23我们学会了Opencv图像上的算数运算。

2017.01.29我们学会了如何给图像加水印,及位运算。

2017.02.02我们学会了Opencv中的图像处理。

2017.02.03我们学会了Opencv如何找到要 跟踪对象的HSV值。

2017.02.06我们学会了Opencv对图像进行几何变换。

2017.02.12我们学会了Opencv几何变换之平移。

2017.02.16我们学会了Opencv几何变换之旋转。

2017.02.20我们学会了Opencv几何变换之仿射变换。

2017.02.23我们学会了Opencv几何变换之透视变换。

2017.02.27我们学会了Opencv图像阈值之简单阈值。

2017.03.02我们学会了Opencv图像阈值之自适应阈值。

2017.03.06我们学会了Opencv图像阈值之Otsu’s二值化。

2017.03.09我们学会了Opencv图像平滑之2D卷积。

2017.03.13我们学会了Opencv之图像模糊/平滑。

2017.03.17我们学会了Opencv图像模糊/平滑之高斯模糊。

2017.03.18我们学会了Opencv图像模糊/平滑之中值模糊。

2017.03.19我们学会了Opencv图像模糊/平滑之双边滤波。

2017.03.20我们学会了Opencv形态学之腐蚀。

2017.03.21我们学会了Opencv形态学之膨胀

2017.03.22我们学会了Opencv形态学之开运算/闭运算。

2017.03.23我们学会了Opencv形态学梯度。

2017.03.24我们学会了Opencv形态学之礼帽和黑帽。

2017.03.25我们学会了Opencv图像梯度S/S算子。

2017.03.26我们学会了Opencv图像梯度之Laplacian算子。

2017.03.27我们学会了Opencv之Canny边缘检测。

2017.03.28~2017.03.29我们学会了Opencv图像金字塔。

2017.04.01~2017.04.02我们学会了Opencv轮廓特征矩。

2017.04.03我们学会了Opencv轮廓矩重心。

2017.04.04我们学会了Opencv轮廓矩面积和周长。

2017.04.05我们初步了解了Opencv轮廓近似。

看看我们走过的路,未来就在前方,加油。我是Y,欢迎大家来我的博客做客。我最近想增增肥,各位小伙伴打赏点饭钱呗?为了彰显出打赏小伙伴的尊贵身份,博主决定为后续的章节做加密处理,不再像上述的内容一样公开分享。我的qq群:142059673,小伙伴们晚安喽~

Opencv之轮廓近似

昨天我们看懂了如何求轮廓周长和面积,今天我们往下进行,来了解什么是Opencv之轮廓近似。

什么是轮廓近似呢?

每当我们要找到我们特定轮廓的图像时,又是并不能完全的找到我们想要的轮廓,比如下面这样的:

Opencv轮廓近似原图像~
原图像~

我们得到轮廓如下:

Opencv轮廓近似得到的轮廓
得到的轮廓

然而为我们想要的轮廓却不是这样的,而是下面这样的:

Opencv轮廓近似,这是我们要的轮廓
这是我们要的轮廓

这个呢就是轮廓近似的定义啦,让我们的轮廓不忽略细节而得到我们想要的轮廓。

我们该如何实现呢?

我们用有两个函数:

  1. cv2.arcLength()
  2. cv2.approxPolyDP()

我今天没弄懂具体的实现源码,所以今天更到这里,明天我一天的课,所以更新的内容可能不会那么多,大家复习为主。我是Y,欢迎大家来我的博客做客~

 

Opencv之轮廓的面积和周长(附完整源码)

昨天我们讲了如何实现Opencv轮廓之:矩+重心,今天我们来看看Opencv之轮廓的面积和周长吧~

什么是轮廓的面积和周长呢?

就是我们常说的面积和周长,没有其他的特别意思。

如何实现轮廓的面积呢?

我们用函数:

  • area = cv2.contourArea(cnt)

如何实现轮廓的周长呢?

我们用函数:

  • perimeter = cv2.arcLength(cnt,True)

这个True表示图像是闭合的。

大家是不是忘了我们用的图像轮廓是什么样的了?

Opencv之轮廓效果图
轮廓效果图

我放下原图像:

Opencv轮廓原图像
原图像

有关于源码,请点这里:源码

好了,这下我们准备好实现了,上源码~

# -*- coding:utf-8 -*-
"""
Created on Tue Apr 4 20:01:42 2017

@author: Y

"""

import cv2
import numpy as np

img = cv2.imread('C:\Users\Administrator\Desktop\opencvimg\orginalp.png')
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

ret,thresh = cv2.threshold(imgray,127,255,0)
print "   "

im2,contours, hierarchy = cv2.findContours(thresh, 1,2)

print "   "
cnt = contours[0]

#计算面积
print "    "
area = cv2.contourArea(cnt)
print "The area is:" , area

#计算周长
print "    "
perimeter = cv2.arcLength(cnt,True)
print "The perimeter is:" , perimeter

看看得到了什么结果吧~

Opencv之轮廓的面积和周长结果
得到的结果~

 

今天的内容就到这里啦,感谢各位小伙伴的陪伴,小伙伴们一定要加油,这条路不好走,希望坚定向前。我是Y,欢迎大家来我的博客做客,大家晚安啦~

Opencv轮廓之:矩(更新版)+重心

昨天我公布了Opencv轮廓之:矩的源码,源码中有错误,今天我找到了错误完美运行。

发布下源码:

# -*- coding:utf-8 -*-
"""
Created on Mon Apr 3 17:13:17 2017

@author: Y

"""

import cv2
import numpy as np

img = cv2.imread('C:\Users\Administrator\Desktop\opencvimg\orginalp.png')
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)

ret,thresh = cv2.threshold(imgray,127,255,0)
print "   "
#try:
    #contours,hierarchy = cv2.findContours(thresh,1,2)
#im2,contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
#昨天就是差在这里,im2再Opencv3.x.x中不能默认存在
im2,contours, hierarchy = cv2.findContours(thresh, 1,2)
#except Exception,ex:
    #print Exception,":",ex
print "   "
cnt = contours[0]
M = cv2.moments(cnt)
print M
print "   "
#计算重心
cx = int(M['m10']/M['m00'])
cy = int(M['m01']/M['m00'])
print cx
print cy

 

那么我们可以根据M的值计算出对象的重心:

我们用这个公式:

重心公式
重心公式

在程序中该如何表示呢?

我们可以这么写:

  • cx = int(M[‘m10’]/M[‘m00’])
  • cy = int(M[‘m01’]/M[‘m00’])

我们把它放到程序中输出一下就得到了cx和cy

Opencv轮廓之重心
这就是我们得到的M的值,求得重心 cx与cy

真高兴自己找到了错误并纠正了它,也许这就是幸福~

大家可以加群交流,我是Y,欢迎大家来我的博客~

 

Opencv轮廓之:矩(代码有错误)

昨天说的有错误的代码还是不知道怎么解决,今天放出来请教下大家。直接上代码:

 

# -*- coding:utf-8 -*-
"""
Created on Sun Apr 2 18:02:32 2017

@author: Y

"""

import cv2
import numpy as np

img = cv2.imread('C:\Users\Administrator\Desktop\opencvimg\test.png',0)
ret,thresh = cv2.threshold(img,127,255,0)
print "   "
try:
    contours,hierarchy = cv2.findContours(thresh,1,2)
except Exception,ex:
    print Exception,":",ex
print "   "
cnt = Contours[0]
M = cv2.moments(cnt)
print M
Opencv轮廓矩错误
这是错误信息

我以为是版本的问题,我换的2.x.x版本也是这个错误,有人知道是怎么回事吗?望解答~

博主真的挺懵逼的,这一个问题困扰我两天了,真心希望有人能解答这个问题,万分感谢!我是Y,欢迎大家来我的博客做客。

Opencv轮廓特征:矩

今天我们来看下Opencv轮廓特征:矩,我会用尽可能简单的语言去讲述本章的内容,那么我们开始吧~

图像的质心,面积怎么得到呢?

我们可以用本章学的矩。

什么是矩呢?

矩是对特征进行参数描述的一种算法。

我们怎么表示矩呢?

我们用字典的形式来表示矩。

用什么函数可以实现矩呢?

  • cv2.moments()

实际上矩在数学中并不是那么简单,毕竟矩可以用来表示颜色特征、纹理特征、形状特征,所以虽然在Opencv中我们用这么一个简单的函数就表示了出来~

说了这么多,我们直接来看看到底是怎么操作的吧:

代码有错误,改完放出来。

这一章没写完,不过先放出来一点~

Opencv中的轮廓

昨天我们学会了Opencv高斯金字塔的实现,我们暂时搁浅了拉普拉斯金字塔和图像融合,进行下一章的学习:Opencv中的轮廓。

什么是轮廓呢?

轮廓就是字面的意思,轮廓可以简单认为成将连续的点(连着边界)连在一起的曲线,具有相同的颜色或者灰度。

轮廓有什么用呢?

轮廓在形状分析和物体的检测和识别中起了很大的作用,比如我们要把跟踪的某个物体加上一层轮廓以便跟踪等等。

怎么查找轮廓呢?

我们用这个函数

  • cv2.findContours()
     这个函数有三个参数:
  1. 第一个是输入图像
  2. 第二个是轮廓检索模式
  3. 第三个是轮廓近似方法

这个函数还有三个返回值:

  1. 第一个是图像
  2. 第二个是轮廓(这个轮廓是用python列表表示的)
  3. 第三个是(轮廓的)层析结构

那又是怎么绘制轮廓的呢?

我们用下面这个函数:

  • cv2.drawContours()

这个函数有三个参数:

  1. 第一个参数是原始图像
  2. 第二个参数是轮廓
  3. 第三个参数是轮廓的索引(当为-1时,默认绘制所有轮廓)

来说下具体的实现思路吧~

  1. 当然还是先调用库
  2. 调用原图像
  3. 二值化图像
  4. 图像阈值处理
  5. 查找轮廓
  6. 绘制轮廓
  7. 显示图像

这就是具体的实现思路啦~

给出原图像:

Opencv中的轮廓原图像
这个就是原图像

看下效果图吧~

Opencv中的轮廓效果图
这个就是效果图~

外面那个绿色的框是因为图像本身也被划为边框。

上下源码吧~

# -*- coding:utf-8 -*-
"""
Created on Thu Mar 30 18:10:41 2017

@author: Y

"""

import numpy as np
import cv2

img = cv2.imread('C:\Users\Administrator\Desktop\opencvimg\sudo.jpg')
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
# 图像阈值化
ret,thresh = cv2.threshold(imgray,127,255,0)
# 查找轮廓
im2, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

# 绘制轮廓
cv2.drawContours(img, contours, -1, (0,255,0), 1)
cv2.imshow("image",img)

cv2.waitKey()
cv2.destroyAllWindows()

 

今天我们讲了Opencv的轮廓的寻找和绘制,内容不少,希望大家好好复习。我是Y,我创建了一个qq群,大家可以加群来交流,如果大家喜欢我的博客可以留言转发,明天见~

Opencv图像金字塔详解

昨天我们讲的,点这里。今天我们会对昨天的内容进行细节讲解。

高斯金字塔的实现?

我们有两个函数:

  1. lower_reso = cv2.pyrDown(img)
  2. higher_reso2 = cv2.pyrUp(img)

第一个函数:

cv2.pyrDown()从一个高分辨率大尺寸的图像向上构建一个金子塔

(尺寸变小,分辨率降低)

第二个函数:

cv2.pyrUp()从一个低分辨率小尺寸的图像向下构建一个金子塔
(尺寸变大,但分辨率不会增加)
我们来用具体的代码来实现一下吧~
# -*- coding:utf-8 -*-
"""
Created on Sun Mar 26 19:01:54 2017

@author: Y

"""

import cv2

img = cv2.imread('C:\Users\Administrator\Desktop\opencvimg\BeHappy.jpeg')
lower_reso = cv2.pyrDown(img)
higher_reso2 = cv2.pyrUp(img)

while(1):
    cv2.imshow('img',img)
    cv2.imshow('lower_reso',lower_reso)
    cv2.imshow('higher_reso2',higher_reso2)
    if cv2.waitKey() == ord('q'):
        break
cv2.destroyAllWindows()
给出原图像:
Opencv图像金字塔原图像
这个是原图像

来看下效果图吧~

Opencv图像金字塔效果图
这个是效果图~

好啦这就是具体的实现啦,有关于图像融合,源码的bug依旧存在,我解决不了,决定先不发出来了。我是Y,欢迎大家来我的博客做客~

Opencv图像金字塔

昨天我们学会了Opencv之Canny边缘检测,今天我们来看看Opencv图像金字塔。

 什么是Opencv图像金字塔呢?

我们先来想想看什么是金字塔,金字塔就是底部宽顶部窄的类似三角形的东西。

那么什么是Opencv图像金字塔呢?自然也是有金字塔结构的东西。

不过具体是个什么呢?

我来举个例子:

当你要从一幅图像中查找某个目标,比如说人脸,我们不知道人脸在图像中的尺寸大小,我们该怎么办呢?

我们这时候需要创建一组图像,这些图像是具有不同分辨率的原始图像。我们把最大的图像放在底部,最小的图像放在顶部,看起来就像是一个金字塔。

这个就是Opencv图像金字塔。

Opencv图像金字塔分为哪几类呢?

Opencv图像金字塔有两类,

  1. 高斯金字塔
  2. 拉普拉斯金字塔

 

那两类金字塔是怎么来的呢?

高斯金字塔的顶部是通过将底部图像中的连续的行和列去除得到的;

拉普拉斯金字塔可以有高斯金字塔计算得来。

具体的解释今天先不讲,我们留到明天讲。

今天的内容就这么多,本来今天想直接讲讲图像融合,不过不知道为什么始终没解决出程序中出现的bug,所以明天我解决了问题,会来和大家详细讲解的。我是Y,欢迎大家来我的博客做客留言,大家晚安啦~