计算机视觉(一):初识OpenCV,更好更快掌握OpenCV

2023-05-16

计算机视觉(一):初识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来处理图片。后面的内容会越来越来,我自己学习起来也会越来越费劲,道路坎坷,且行且珍惜吧…

最后免费分享一些我整理的人工智能学习资料给大家,包括一些AI常用框架实战视频、图像识别、OpenCV、NLQ、机器学习、pytorch、计算机视觉、深度学习与神经网络等视频、课件源码、国内外知名精华资源、AI热门论文、行业报告等。

为了更好的系统学习AI,推荐大家收藏一份。

欢迎关注威❤公众hao【咕泡AI】回复(123)即可白嫖领~~~
​​​​​​​

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机视觉(一):初识OpenCV,更好更快掌握OpenCV 的相关文章

  • Matlab 中 interp2 的类似 OpenCV Api

    有没有类似的功能 其工作原理与 interp2 x y frame z xd yd linear 0 在 OpenCV 中 功能cv remap 几乎可以满足您的要求 请参阅文档here http docs opencv org modul
  • 在opencv中保存帧而不压缩

    我正在尝试使用写 OpenCV 函数 我想保存帧 TIFF扩大 我遇到的问题是保存的图像被压缩 所以我无法使用它们 知道如何摆脱这种压缩吗 提前致谢 不要介意西奇说的话 TIFF 标志通过 LZW 压缩硬编码在 opencv 二进制文件中
  • 将四边形(四边形)拟合到斑点

    应用不同的过滤和分割技术后 我最终得到如下图像 我可以访问一些轮廓检测函数 这些函数返回该对象边缘上的点列表 或者返回一个拟合的多边形 尽管有很多边 远多于 4 个 我想要一种将四边形适合该形状的方法 因为我知道它是应该是四边形的鞋盒的正面
  • opencv 视频上的颜色阈值

    I am thresholding for a color range in an opencv video The goal is to seperate the B mode black and white information on
  • 收据褪色部分可以恢复吗?

    我有一些包含一些扫描收据的文件 我需要使用 OCR 从中提取文本 由于收据上打印的文字在一段时间后会褪色 导致收据上的某些文字不清晰 影响OCR结果 褪色单词的一些示例 有什么方法可以恢复褪色的部分 以便提高 OCR 结果吗 我在OpenC
  • opencv中矩阵的超快中值(与matlab一样快)

    我正在 openCV 中编写一些代码 想要找到一个非常大的矩阵数组 单通道灰度 浮点数 的中值 我尝试了几种方法 例如对数组进行排序 使用 std sort 和选择中间条目 但与 matlab 中的中值函数相比 它非常慢 准确地说 在 ma
  • Opencv matchTemplate 和 np.where():仅保留唯一值

    继带有马里奥硬币的 opencv 教程 https opencv python tutroals readthedocs io en latest py tutorials py imgproc py template matching p
  • Opencv未找到所有轮廓

    我试图找到该图像的轮廓 但是该方法查找轮廓只返回1轮廓 轮廓突出显示image 2 我正在努力寻找all外部轮廓就像这些圆圈 里面有数字 我究竟做错了什么 我可以做什么来实现它 image 1 image 2 以下是我的代码的相关部分 th
  • 提高 pytesseract 从图像中正确识别文本的能力

    我正在尝试使用读取验证码pytesseract模块 大多数时候它都能提供准确的文本 但并非总是如此 这是读取图像 操作图像以及从图像中提取文本的代码 import cv2 import numpy as np import pytesser
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • 如何将 mat 转换为 array2d

    我为dlib http dlib net face landmark detection ex cpp html那里的面部地标代码使用 array2d 来获取图像 但我喜欢使用 Mat 读取图像并转换为 array2d 因为 dlib 仅支
  • 无法在 Windows 7 机器中使用 OpenCV 2.4.3、Python 2.7 打开“.mp4”视频文件

    我目前正在进行一个涉及读取 mp4 视频文件的项目 我遇到的问题是它在Windows 7机器上使用Python 2 7 32位 OpenCV 2 4 3 cv2 pyd 代码片段如下 try video cv2 VideoCapture v
  • opencv 2.3.* 读取不工作

    我无法让 imread 工作 与这个人有同样的问题 OpenCV imwrite 2 2 在 Windows 7 上导致异常 并显示消息 OpenCV 错误 未指定错误 无法找到指定扩展名的编写器 https stackoverflow c
  • 如何在 OpenCV 中从 YUV 文件读取帧?

    如何在 OpenCV 中从 YUV 文件读取帧 我编写了一个非常简单的 python 代码来从二进制文件读取 YUV NV21 流 import cv2 import numpy as np class VideoCaptureYUV de
  • OpenCV Visual Studio ntdll.dll

    我尝试在 Visual Studio 2013 上使用 OpenCV 2 4 10 创建一个项目 但由于以下异常 到目前为止我运气不佳 请建议帮助 TIA letstryitonemoretime exe Win32 Loaded C Us
  • OpenCV C++ 如何知道每行的轮廓数进行排序?

    我有一个二值图像 https i stack imgur com NRLVv jpg在这张图片中 我可以使用重载的函数轻松地对从上到下 从左到右找到的轮廓进行排序std sort 我首先通过以下方式从上到下排序 sort contours
  • 仅获取图像中的外部轮廓

    我有这段代码 可以在图像中绘制轮廓 但我只需要外部轮廓 import cv2 import numpy as np camino C Users Usuario Documents Deteccion de Objetos 123 jpg
  • 为什么我无法在 Mac 12.0.1 (Monterey) 上使用 pip 安装 OpenCV? [复制]

    这个问题在这里已经有答案了 当我尝试使用 python pip 安装 OpenCV 时 它显示了以下内容 Remainder of file ignored Requirement already satisfied pip in Libr
  • 如何去除给定图像中的噪声,使 ocr 输出完美?

    我已经对这个孟加拉文本图像进行了大津阈值处理 并使用 tesseract 进行 OCR 但输出非常糟糕 我应该应用什么预处理来消除噪音 我也想校正图像 因为它有轻微的倾斜 我的代码如下 import tesserocr from PIL i
  • OpenCV IP 相机应用程序崩溃 [h264 @ 0xxxxx] 访问单元中缺少图片

    我在 cpp 中有一个 opencv 应用程序 它使用 opencv 的简单结构捕获视频流并将其保存到视频文件中 它与我的网络摄像头完美配合 但是 当我运行它从 IP 摄像机捕获流时 它可能会在大约十秒后崩溃 我的编译命令是 g O3 IP

随机推荐