计算机视觉(一):初识OpenCV - 知乎

近几个月,也是一直在寻找自己以后的方向,一直在迷茫中,但也在不断得探索着。觉得自己最感兴趣的还是计算机技术这一块,尤其是计算机视觉。

从业以来,一直在做数据方面的工作,但个人认为这和我学习计算机视觉丝毫不矛盾,计算机视觉也会用到大量的数据,机器学习、人工智能等技术会经常接触。

计算机视觉中对图片的边缘检测,用到的算法其实就是滤波函数,通过过滤噪音,寻找真正的波的最大震荡位置。这种滤波函数其实完全可以用到股票交易中,将小的波形过滤掉,在大的波形中寻找买卖点。我之前智能选股系统还是有一些不足需要调整,比如对大盘牛市时找不到较好的进场点,这一块也许可以在滤波函数中寻找些什么灵感。所以学术很多东西都是相通的,没必要那么较真必须要在哪一领域一路磕到死。俗话说技多不压身,重要是你感兴趣,勇敢的去探索。

并且计算机视觉对未来医疗、无人驾驶等高科技领域有着不可或缺的地位。所以抱着极大的兴趣,我决定踏入计算机视觉的领域。

首先认识到的是OpenCV,初次见到它是在17年年底的时候。那时候领导让我制作一个银行高端客户服务系统的模型,说白了就是一套人脸识别系统,后端对接一个产品推荐系统。那时候对人脸识别一无所知,恰好安排了这样一个任务,在网上查阅了很多的资料,并且正好我对python这门语言还算熟悉,有很多成熟的接口和应用可以直接拿来使用,看了少许的源码,便可以着手制作了。其中就有OpenCV这么个东东。

OpenCV可以用来做什么?

具体什么是OpenCV,我就不赘述了,网上的介绍有很多。但是对于OpenCV可以做什么,网上没有太多具体的答案,都是一些只言片语,能做什么完全看自己的需求内容。

为了解决内心中的这个问题,我专门在网上找了一些答案,其中有个视频挺有趣的,介绍了OpenCV可以用来做什么,有兴趣的同学可以看看:

What things can be done using OpenCV? Watch this video

(打不开?联系:330444919)

视频中介绍了很多OpenCV在现实生活中使用的案例。比如下面这个截图,是对摄像机采集到的每一帧数据做处理,寻找出草坪的边界,并画出线条。

比如还可以识别物体,也是对摄像机捕获的数据进行处理分析,得到下面的效果:

动图封面

不知你有没有好奇过虚拟现实中的3D效果是如何做出来的?OpenCV也可以带你找到答案。

既然可以识别出草坪的边界,那么对于车道的边界,也可以识别出来。我在想汽车在倒车时,上面的图像显示应该也可以利用OpenCV来实现吧。

视频的后面还录制了一段蚂蚁的运行轨迹,看起来也相当有趣。

完整版的视频已经被我下载下来了,在文章的末尾。

当然,除了以上这些案例,一定还有很多很多领域可以用到它,比如人脸识别、医疗图像等。好吧,就不一一列举了,赶紧带着强烈的好奇心,走进它吧。

安装OpenCV

上次是在ubuntu上进行安装的,需要进行源码编译,否则无法启动摄像头。为了避免这样类似的麻烦,我将OpenCV装在了windows系统中。

在windows中安装OpenCV非常简单。

通过 pip

pip install opencv-contrib-python --upgrade

或者安装无额外模块版本的

pip install opencv-python

测试OpenCV是否安装完成

(cv) C:\Users\33044>python 
Python 3.6.7 |Anaconda, Inc.| (default, Oct 28 2018, 19:44:12) [MSC v.1915 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. 
>>> import cv2 
>>> print(cv2.__version__) 
3.4.3

测试OpenCV是否可以启动摄像头

在OpenCV的官方文档中有一份测试代码,可以创建一个camera-test.py的文件

import numpy as np
import cv2

cap = cv2.VideoCapture(0)

while(True):
    # Capture frame-by-frame
    ret, frame = cap.read()

    # Our operations on the frame come here
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
   
    # Display the resulting frame
    cv2.imshow('frame',frame)
    cv2.imshow('gray',gray)
    if cv2.waitKey(20) & 0xFF == ord('q'):
        break

# When everything done, release the capture
cap.release()
cv2.destroyAllWindows()

当运行python camera-test.py时,你会看到摄像机启动两个画面,一个画面中是正常的颜色,一个画面是灰度图像,此时代表你的OpenCV安装得没有问题。

OpenCV的GUI特性

以下是我本人的学习笔记,我挑几个重要的点记录一下,以便有一些对OpenCV新的思考。

读取本地文件

读取摄像头,在开头就已经介绍过,接下来读取视频文件。

和捕获摄像头一样,只是需要将VideoCapture()的参数项改为视频文件的名称。

在读取视频的时候,cv.waitKey() 如果设置特别小,视频将会播放特别快;反之则反之。值设置为 25 毫秒视频是正常的速度。

import numpy as np
import cv2 as cv

cap = cv.VideoCapture('YTTLJ.flv')

while(cap.isOpened()):
    ret, frame = cap.read()

    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)

    cv.imshow('frame', gray)
    if cv.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv.destroyAllWindows()

运行上面的代码会出现视频的播放,播放速度较快,因为waitKey()中的参数设置的为1。

你会发现视频的播放是没有声音的。当时我挺纳闷,难道OpenCV在处理视频的同时不处理音频吗?因此我特意去网上搜索了答案。

有网友解释说,OpenCV是一款计算机视觉的框架,所以只处理图像,不处理音频。

如果想要处理音频,可以使用另一款神器:ffmpeg,日后有时间我也会写写它。

对于这一点,我有一些想法。近日我在处理一些视频,如果使用ffmpeg的话,由于都是shell命令操作,有些需求可能没有办法做的很好,那么完全可以通过OpenCV来完成。

当然在使用OpenCV处理之前,需要向利用ffmpeg将视频进行截取,然后提取出其音频。利用OpenCV处理完视频之后,再通过ffmpeg将音频拼起来即可!~

结合 matplotlib

matplotlib是python中一个功能丰富的可视化库,其可以与OpenCV结合,进行图像的处理。

具体操作如下:

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
%matplotlib inline

img = cv.imread('building.jpg', 0)
plt.imshow(img,  cmap='gray', interpolation='bicubic')
plt.xticks([])
plt.yticks([]) # to hide tick values on X and Y axis
plt.show()

输出:

需要注意的是:OpenCV在加载图片时是BGR模式,而matplotlib是RGB模式。所以当图片以OpenCV加载进来时,通过matplotlib显示出来的颜色不会准确。

BGR:即蓝-绿-红色彩空间,每一个像素点都由一个三元数组来表示,分别代表蓝、绿、红。与之相对的RGB在数组表达时的顺序不同。

这也就理解了为什么matplotlib显示通过OpenCV加载进来的图片时颜色会不准确。

通过OpenCV画图

OpenCV也可以画各种图形,尤其是一些几何图形,通过会在一些应用中用到。

这里面没有什么可注意的地方,OpenCV中的每个画图的函数用法都一样,只不过功能不同罢了。

下面举个例子,注意参数的填充:

import numpy as np
import cv2 as cv

# Create a black image
img = np.zeros((512, 512, 3), np.uint8)

# Draw a diagonal blue line with thickness of 5 px
cv.line(img, (0,0), (511, 511), (255, 0, 0), 5)
# 画椭圆
cv.ellipse(img,(256,256),(100,50),0,0,180,255,-1)
# 画长方形
cv.rectangle(img,(384,0),(510,128),(0,255,0),5)
# 画圆
# 对象、圆心位置、半径、颜色、厚度
cv.circle(img,(447,63), 63, (0,0,255), 7)
# 画多边形
pts = np.array([[10,5],[20,30],[70,20],[50,10]], np.int32)
pts = pts.reshape((-1,1,2))
cv.polylines(img,[pts],True,(0,255,255))

# 添加文字
font = cv.FONT_HERSHEY_SCRIPT_SIMPLEX
# 对象、文字内容、位置、字体、字体大小、颜色、字体线条厚度、线条类型
cv.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv.LINE_AA)
cv.imshow('img', img)
cv.waitKey(0)
cv.destroyAllWindows()

输出:

总结

今天对OpenCV就介绍到这里吧。文章开始对OpenCV有个初步的了解,知道它可以应用到很多的领域,接着介绍了如何安装OpenCV,在windows中安装它真的很简单。后面介绍了它的一些GUI特性。

写一篇文章将会记录如何利用OpenCV来处理图片。后面的内容会越来越来,我自己学习起来也会越来越费劲,道路坎坷,且行且珍惜吧…

14:59


原网址: 访问
创建于: 2024-02-02 15:52:45
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论