番外1. OpenCV 图像处理之图片加载与视频加载

本系列专栏写作方式交代

本系列专栏写作将采用首创的问答式写作形式,快速让你学习到 OpenCV 的初级、中级、高级知识。

1. OpenCV 中图片是如何加载与显示的?

学习 OpenCV 的第一步就是加载图片,类似学习任何编程语言的 Hello Word一样, 将电脑磁盘上的图片加载到程序中,才可以进行后续的操作。

在加载图片的过程中,我们将使用到三个核心函数,分别如下:

  • <kbd>cv2.imread</kbd> 读取图片
  • <kbd>cv2.imshow</kbd> 展示图片
  • <kbd>cv2.imwrite</kbd> 写入图片

任何图像处理领域的高手,都是伴随这三个函数起步的,接下来你也将接触到这3个起始函数啦

cv2.imread 读取图片的用法与注意事项

在读取图片之前,你首先要知道图片所在的位置,即电脑磁盘路径,该部分如果你完全零基础,建议你学习【绝对路径】与【相对路径】相关知识。

<kbd> cv2.imread</kbd> 函数具备两个必会参数,其一图片路径,其二是读取方式,也就是告诉程序如何读取这幅图像。

第一个参数的取值非常简单,就是电脑上任意图片路径即可,重点注意图片的后缀名(扩展名),

第二个参数取值非常多,初学阶段掌握以下两个数值即可

  • <kbd>cv2.IMREAD_COLOR</kbd>,读取彩色图像,此时忽略图像的透明度,使用该值时,如果读取的是透明 png 图片,一定要注意,透明通道不会被读取到
  • <kbd>cv2.IMREAD_GRAYSCALE</kbd> 灰度图方式读取
  • <kbd>CV2.IMREAD_UNCHANGED</kbd> 读入的图像包括 <kbd>alpha</kbd> 通道,即透明通道

这里存在一个问题,需要特别说明一下:

除了上述几个值以外,还有其他值,但是在学习阶段可以先略过,等到需要的时候。

那这里就有一个常见疑问,就是存在这样一个值 <kbd>cv2.IMREAD_ANYCOLOR</kbd>,这个值与 <kbd>cv2.IMREAD_COLOR</kbd>

有何区别呢?

<kbd>cv2.IMREAD_COLOR</kbd> : 设置该值只会读取BGR三个通道;

<kbd>cv2.IMREAD_ANYCOLOR </kbd>:设置该值会按照任何可能的颜色通道读取;

如果你一直操作的都是 BGR 通道的图片,那 <kbd>ANYCOLOR</kbd> 永远意识不到区别

读取图片的代码如下

import cv2

img = cv2.imread('./test_img.jpg')
print(type(img))

以上代码从Python语言上来看,没有什么特别难的地方,但是会出现如下错误

本系列专栏既然是为了解决问题而写,那我们关注的就是BUG。

读取图片的时候,正常会读取到一个图片资源,图片类型如下所示

<class 'numpy.ndarray'>

但是,很多时候,会返回一个空值

<class 'NoneType'>

该值出现的原因是,你的图片路径不对,即没有读取到你的目标图片,修改图片路径即可解决问题。

本部分代码中 './test_img.jpg' 为图片路径,专业术语叫做硬编码,实际开发过程中,建议采用<kbd>os</kbd>、<kbd>path</kbd> 模块实现对路径的自动处理。

还有一种可能性会导致你返回 <class 'NoneType'> ,不过该种可能性出现的情况比较少,很多人会忽略,就是图片所在的文件夹,你没有权限进行访问,如果该问题出现了,你需要补充的就是文件权限相关的知识。

cv2.imshow 显示图像的使用方法与相关注意事项

默认使用 <kbd>cv2.imshow</kbd> 函数即可显示图像,而且打开的窗口会自适应图片,该函数也包含两个参数,其一是窗口名字,注意不要使用中文,其二是图像。

这个函数的实际应用比较简单,但是有如下问题,需要注意,具体代码为:

import cv2

img = cv2.imread('./test_img.jpg')
print(type(img))
cv2.imshow('image',img)
cv2.imshow('image',img)
cv2.waitKey(0)
2b80d925e7114d81a5cba8f94fa4070d[1].png

测试上述代码之后,程序运行之后只会出现一个窗口,这是因为我们两次使用 <kbd>cv2.imshow</kbd> 函数,第一个窗口名称参数给了相同的值,如果希望打开两个窗口,一定要将该参数设置为不同值。

这里还扩展出了一个新的函数 <kbd>cv2.waitKey</kbd>,如果没有该函数,窗口将一闪而过。

该函数准确的说是键盘绑定的函数,只是这里用了它等待响应这一目的。

<kbd>cv2.waitKey</kbd>具备一个参数,含义是时间,注意单位是毫秒,如果期望设置具体的毫秒数,按照预期设置参数值即可,如果设置为 0,窗口将无限等待下去,直到关闭,或者按下特定按键。

在这个地方有一个需要特别注明,并且大家可以扩展学习的知识点

一般情况下,我们按照如下设置进行窗口检测:

k = cv2.waitKey(0)
if k == 27:
    pass

以上代码在 32 位机器上可以正常运行,但是在 64 位机器,建议按照下述代码修改:

k = cv2.waitKey(0) & 0xFF
if k == 27:
    pass

上述代码还可以进行修改,具体如下:

import cv2

img = cv2.imread('./test_img.jpg')
cv2.startWindowThread()
cv2.namedWindow("image_show")
cv2.imshow("image_show", img)
cv2.waitKey()

其中新增加了 <kbd>cv2.startWindowThread</kbd>函数与<kbd>cv2.namedWindow</kbd>函数

以上两个函数的含义如下:

  • <kbd>cv2.startWindowThread</kbd>:新开一个线程用于实时刷新图片
  • <kbd>cv2.namedWindow</kbd>:命名一个窗口,并且让窗口可调整

<kbd>cv2.namedWindow</kbd>函数可以进行拆解下:

默认情况下,我们使用 <kbd>cv2.imshow</kbd> 打开的窗口是不能调整窗口比例的,如果希望可以调整,就必须用到 <kbd>cv2.namedWidows</kbd> 函数,毕竟不是所有的电脑都是高分辨率的,例如橡皮擦自己的电脑就很难展示大图。

该函数的原型如下:

cv.namedWindow(winname, flags=None)

其中 <kbd>winname </kbd>是窗口名称,后续 <kbd>cv2.imshow</kbd> 在调用的时候,第一个参数要与其匹配上,第二个参数是窗口标志。

  1. <kbd>WINDOW_NORMAL</kbd>:显示图像后,允许用户随意调整窗口大小;
  2. <kbd>WINDOW_AUTOSIZE</kbd>:根据图像大小显示窗口,不允许用户调整大小;
  3. <kbd>WINDOW_FREERATIO</kbd>:窗口大小自适应比例;
  4. <kbd>WINDOW_KEEPRATIO</kbd>:保持图像的比例。

默认值是 <kbd>WINDOW_AUTOSIZE</kbd>。

以上内容比较简单,不做代码演示。

cv2.imwrite 写入图像的使用方法与相关注意事项

使用 <kbd>cv2.imwrite</kbd> 函数可以保存一张图片,该函数也具备两个参数,第一个为图片名,第二个为待保存的图片

该函数的使用非常简单:

import cv2

img = cv2.imread('test_img.jpg')
cv2.imwrite('test.jpg',img)

该函数还有一个非必填参数,即可选参数,并且它存在不同解释。

如果保存的为 JPG 图片,表示的是图像的质量,用 0~100 的整数表示;

如果保存的为 PNG 图片,表示的是压缩级别,默认为 3

使用的时候,参照如下代码即可:

cv2.imwrite('test.jpg',img, [int(cv2.IMWRITE_JPEG_QUALITY), 95])
cv2.imwrite('test.png',img, [int(cv2.IMWRITE_PNG_COMPRESSION), 4])

如果使用 <kbd>cv2.imwrite</kbd>发现文件并没有存储成功,注意,该问题可能是中文路径的问题,例如下述代码:

import cv2

img = cv2.imread('test_img.jpg')
cv2.imwrite('./图片/test.jpg',img)

出现该问题之后,建议将中文路径名进行修改,否则只能切换其他图像保存方法。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342

推荐阅读更多精彩内容