pythonopencv安装_一起学opencv-python一(opencv安装和简介和图像和视频的读取与保存)...

pythonopencv安装_一起学opencv-python一(opencv安装和简介和图像和视频的读取与保存)..._第1张图片

opencv就是Open Source Computer Vision Library,就是一个开源的计算机视觉库。2b1c93bce2196df4339c129cc7696a4bafea2df4.png

我们先来下载opencv,这里我默认你们已经把环境配置好了,不会配置的到前面的教程里面看吧。下面三个模块是和opencv相关的,opencv-python是必须要安装的。opencv-contrib-python是一个扩展的模块,有很多功能,比如图片拼接,CNN人脸识别,OCR等。pytesseract是谷歌的一个开源的OCR的一个库。2251841af500d535fa3b79fcb39ff8c6a5d4c38d.png

安装opencvc94ca4554bc5a2a6e97b28ddc8d90fe2384f0813.png

那我们就都安装一下吧,这里说一下如果你下的是anaconda,把pip全部换成conda就可以,当然安装anaconda也还是可以用pip的,这个前面的教程都是讲过的。下面是anaconda如何安装:

anaconda的时候需要注意,输入opencv-python是没有的。提示找不到这个包。23d013f3119f4c497c223ee3b847670c047c047e.png

直接输入opencv就可以。a2188f8bb69a5b0905fad6d246cb4d97b58330dc.png

这个是直接安装了三个包,在python里面导入也没有问题。1bd08a5dc4ab4d61385d91a6f16c663ae5440ff2.png

8f101f42bcc29013d114b45ecb392012a8a0d854.png

87a22de311fa26527c17cd1fa32666a0ba62759a.png

上面两个库安装失败的原因都是库的名字不对,其实我们上面已经安装了三个包,其中有一个libopencv,我觉得这个应该就是opencv的一些库,下面是看一下opencv的版本。04832ad905b05453ff356f1f4066e74b40f0152c.png

pip安装(下anaconda,pip配置到环境变量里也可以用的):

我没有卸载上面用anaconda安的opencv,直接接着用pip安装。dbe09e9c415351237feb3301ced5537c59b1a85f.png

你们第一次用pip安装应该是会有一个进度条,我是安装过然后卸载了,这是重新安装,上次安装还留下了一些文件,所以这么快,也没有进度条。看到pip安装的版本是3.4.2,在python里面导入也确实是3.4.2的。那么接着安装另外两个,01fe7c5e8f2741212062ad8d6d7a4ca3e24825f4.png

不过速度有点感人啊78kB/s,因为用的是国外的源,那么下面我们来换源,参考了https://blog.csdn.net/lambert310/article/details/52412059

我在c:/user/lenovouser里面创建了一个pip。a8655a6022e7d1cde3971dfafa758b10e64eb266.png

然后在里面新建一个pip.ini,把上面文章里的复制进去。5a567fd427e7c88983b3d37f8cc4b1299c3ea7c0.png

然后保存。下载最后一个模块。3cc6dd84dc1f6f9d5dd94c148b743639bd6c65bc.png

确实是换成了清华的源,速度快了十几倍,957kB/s。我们就用pip安装的3.4.2版本的吧,把用anaconda安装的卸载掉。a08d9530d364f53bf27f2fe2de685817755c4f4d.png

opencv简介b5ee0663c282cba2e50ce68e3dcebf7ec95bf110.png

opencv有很多模块,竖着的是一些比较高级或者说专业的模块,横着的是一些基础模块,高级模块是基于基础模块的,俗话说的好,基础不牢,地动山摇,这些基础模块都学不好的话,高级模块更没有办法去学习。其中蓝色的两个imagcodecs和videoI/O分别是管理图像和视频的输入输出的模块,imagcodecs负责图像的编解码,videoI/O负责视频的输入输出,这两个模块opencv都封装了很高级的api来供我们使用。core,顾名思义,是一个比较核心的模块,像素级别的运算都在这里面。image processing模块中包含了很多内容,后面主要学习的就是这个模块,然后如果你想专业一点深入一点,可以继续学习竖着的专业的模块,比如对象检测,这里要稍微说一下检测和识别,拿人脸为例,人脸检测只是检测出来说这里有一张人脸,但是是谁不清楚,而人脸识别深入一步,要识别出来这个人脸是谁。high-level gui模块就是一些gui呗,右边红色的扩展模块大概就是在opencv-contrib-python里面,左边的这些是在opencv-python里面有的。

图像的加载与保存

首先了解一图像在计算机里面如何存储的。a845535fe225ccc746fb5c4640b870ccbd78a1af.png

图像是由一个一个像素点矩阵排列组成的。220263260b79ea904e4be8dbd293d79232512987.png

如果是灰度图,那么图像是有一个通道,每一个像素点有一个灰度值,组成一个矩阵,如果是彩色图,有BGR三个颜色通道,每一个像素点上有一个强度值,在0-255之间,可以用一个字节来存,那么就有三个矩阵。这里先推荐一个opencv函数库查询。

函数库查询:https://blog.csdn.net/weixin_40427089/article/details/81365076

下面会用到的先列出来:85215b4621a186a6c1cd1d9e2291e1084a34b942.png

95bd87cec86ced888b731e68ef6144daf641001a.png

cv2.waitKey()是一个键盘绑定函数。它的参数是以毫秒为单位的时间。该函数等待任何键盘事件的指定毫秒。如果您在该时间内按任意键,程序将继续。如果为0,则无限期等待键击,这个意思就是说如果没有外部键盘敲击,就一直卡在这一行,不会执行cv2.waitKey()下面的代码。下面还参考了https://www.jianshu.com/p/7fcfc6253c814729f32d466c8fb5a42e15a237cbd2d617171368.png

也就是namedWindow就是设置窗口大小的一个函数。下面来操作一下。

我看到有的人用pycharm的说加载不出来,可以去

https://www.bilibili.com/video/av30953498?spm_id_from=333.338.__bofqi.15

21分钟左右看看能不能解决,反正我的sublime是没有一点毛病。因为namedWindow默认是cv2.WINDOW_AUTOSIZE。所以其实有没有namedWindow也是可以的,并且不给namedWindow函数的第二个参数,默认也是cv2.WINDOW_AUTOSIZE,所以图片的大小是没有办法拖动边框改变大小的,并且我们按键盘上的任意一个键都可以关掉窗口。下面我们添加一个函数namedWindow并且给第二个参数cv2.WINDOW_NORMAL。那么就来看一看效果,这里由于上面的图片太大,录制的gif超过了3M,我换了一个比较小的图片。

效果也就是拖动边框可以改变图片的大小。看到里面还有一些其它的信息。0096d939764a1ec6c7e51d911df19838a466d55e.png

p的类型是numpy.ndarray。84c9770fd3d7bdc3aeadc1d78841a2e02b5009cf.png

Numpy库中的矩阵模块为ndarray(n维数组)对象,有很多属性:T,data, dtype,flags,flat,imag,real,size等。shape打印出来的元组有三个元素,说明是三维数组,(150,200,3)中三个数字代表水平像素为200,垂直为150,(也就是200列,150行)3是表示有三个通道。size是大小,90000=150×200×3。dtype是数组每一格元素的存储类型,是unint8,也就是无符号整数8位二进制,因为0-255可以用8bits装下。opencv里面矩阵运算和矩阵存储用到的就是numpy,其实上面安装opencv的时候numpy就是一个依赖库,所以后面的内容会有很多numpy的内容。我下面来试一下namedWindow是不是能放在imshow后面呢?c026bb7b4729f4ae249d8f82d40b9eaab10a757a.gif

看到效果是图片虽然可以显示出来,但是不能调节大小,说明namedWindow需要放在imshow前面才会起作用。下面再简单试一下waitKey()。d6fc1cc443690545b4041a26b173c5cdbd0a5e24.gif

waitKey(1000)的效果是等待1000ms也就是1s才执行下一行代码,从这点来看,和延时函数的作用是一样的,但是waitKey(0)不是不延时,而是无限延时,并且正如waitKey函数起的名字一样,它除了wait还有Key,就是在延时时间内如果键盘上有键按下,那么也会执行下一行代码。我们加一段程序指定输入哪一个或者哪几个键才有效。839bbb787162b17cee6aa06bd71b31918ab8aee8.png

27就是ESC的ASCII码。ord('s')是求s的ASCII码。23acbaed7f91af230000e85c3c1aca0eee338054.png

下面我们来试一试:

看到没有问题,虽然上面有一个如果是64位机需要写成k = cv2.waitKey(0) & 0xFF,不过我没改也没有问题,这个和0xFF按位与其实就是取低八位的意思,因为esc和s的ASCII码都没有超过八位,所以是没有意义的,如果有超过8位的和0xFF按位与,就是取低8位,不过我没看出来这里为什么要和0xFF按位与。上面用到了一个imwrite,也很简单e067af84eb5915f5df38a3116360258473079abb.png

中文翻译一下.号给搞成句号了。不过我发现waitKey其实并没有那么简单:

这个waitKey里面的参数默认就是0,填负数应该也按照0处理了。看上面的gif,还会发现一个问题就是,如果waitKey是python脚本里面最后一个waitKey,这个waitKey是有destroyAllWindows的功能的,再来看一下:4ddf34967dc4bc8c2304210a39cfb68b35cc5197.gif

所以要想实现指定键销毁某一个窗口,那么就不能在最后一个waitKey后面,原因就是上面所说。最后,官方文档中还提供了一个matplotlib的例子,我也来试一下57344e35a72d8db80fc4018b7f4b75eceb82afc8.png

可以用pip或者conda安装,不过这个已经安装过了,可能是opencv的依赖库?或者是安anaconda时安装的?不管了。这个安装也不难。6843d0a73f401589686d0d6777eafd5abf99fd39.png

0b483cd1727995b217d5211f2e943c4d38dbb03d.png

imread里面0的意思其实就是灰度图像,参看下图里的解释。40d09bccbba9d5ff0f51672a29794f9b336baff9.png

不能用彩色吗?61b964692036a86ddc53d3c6f7c26d3a1f1cbf53.png

这是怎么回事?这是因为OpenCV加载的彩色图像处于BGR模式。但Matplotlib以RGB模式显示。因此,如果使用OpenCV读取图像,则Matplotlib中的彩色图像将无法正确显示,也就是通道对不上。那么问题来了,为什么opencv要采用BGR顺序的模式呢?这又是因为历史原因,早期的opencv开发者采用了BGR顺序,所以一直遗留下来了。那么早期的opencv开发者为什么要用BGR呢,因为那时的许多照相机生产厂家和软件开发商就是采用的BGR模式。能不能正常显示呢?是可以的,参考了https://blog.csdn.net/saltriver/article/details/78173219。

我们把BGR转换为RGB就可以了,只需要添加一句:img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)3ad3928160b34660f2e47ea89d786bc0d9109ff7.png

29f48b7655dc891bd6c18fd2843184bcbc04aa00.png

我们也是可以查看每一个像素点的值的。bfe4fc2ca2c68ac8f02cca9b155231d57a233b28.png

用了一个np.array。这里面有省略号,因为太多了嘛,最里面的中括号里面有三个值,代表的应该就是BGR,外层的两个中括号里面装的是行和列,最外面的括号应该是每一行的像素点,中间的是每一列,应该是按照(150,200,3)这个顺序。

视频的读取和保存

1从摄像头读取

还是先来理解一些函数3397a0aca0477a87ae536e08188a2b762ac35c92.png

70a0b633d579a78f1b941e5f4e5b8387a3218fbb.png

官网的案例:a309a5012e9893e95a8df950f55d392beb159b19.png

a36df1926035a879518b18f308b2cb5f9e282369.png

ret是一个返回值,frame是每一帧,我们这里刷新的很快,waitKey(1)就是大概1ms刷新一次,我们用一个while循环让每一帧连起来,看起来就是一个视频。我实际的代码是这个样子的:aa84530533b0a0d2c781044e7676937b3b505ced.png

首先里面用了一个flip,这个是翻转,为什么要翻转呢?因为摄像头的视角和我的视角是镜像的,我向左,出来的图像是向右的。

https://blog.csdn.net/jningwei/article/details/78753607d167671b44814474828848c986ed819e55bb56a1.png

还有我把cap.release和cv2.destroyAllwindows()注释掉了,这两句可以不要,当然你加上也没有问题。看一下效果:

链接: https://pan.baidu.com/s/16Uf8NVu7TLFLPoktLrGueA 密码: 1gvu(这里因为太大了,所以gif不能插入,请到网盘看一下,至于b站视频投稿这个方式,gif不能上传,其它格式处理时间太长了,b站动态也不能发大于8M的,将就一下这么看吧)

这个摄像头的窗口用右上角其实时可以关闭的,但是为什么又出现了呢?这是因为有一个while循环,而waitKey是和键盘绑定的,鼠标的这个事件它是不识别的,只有我们按q的时候,就跳出了循环。

2从文件播放视频

人眼的视觉暂留时间大概是0.1s,也就是说小于10fps(每秒小于10帧),我们就会感觉到明显的不连贯,卡顿。25ms一帧完全没有问题。下面的waitKey(1)就更不用说了。6ffa5e48ecd983345af70d4921cb761e5244218a.png

dd3bdc189540ed15a10954aa3de7155563aa4357.png

视频的保存5ca784f5e7e81fd45eac202cfcf0133fb94a6602.png

08537a94a89cf347cda090df154e2c06db6b5627.png

412a3e58ddd1140d4253613b0106111dae25128a.png

那么我们下面就演示一个过程,就是用摄像头录制一段视频,然后读取。444ad2d0ceadacff8261f70d67505599345bdc6d.png

88c45b53a055a9d740de5f4f86ae0c82e08cf41e.png

我们看一下效果:

链接: https://pan.baidu.com/s/195gqEZ0wnEAmZ06-hDqqwA 密码: zynu

看到报错了。f7ae28fc6c44e9ba89f300e598665fa3733b8aed.png

这个错误原因其实是因为视频播放结束了,然后frame就是一个Nonetype,所以会违背size.width和size.height都大于0的要求,准确地说用地是断定(Assertion),Assert后面的值为假就会报错。8b5c919818a5c0dd49851cdbdbe120e9079d48cc.png

我修改了一下:be12aa616cba852de993e29605f194280f599690.png

就没有问题了,看一下效果:

链接: https://pan.baidu.com/s/1lXBgOVBZMC729zCuHPmt4Q 密码: cqg6

细心的人可能注意到了我上面的代码tab和空格是混用的,但是没有报错,我们最好还是统一,这个我暂时说不清楚,不过如果和代码挨着的都是空格,好像就没有问题。这一讲先到这里。

最近在画PCB,所以会比较忙,但是会一直更新下去,不断扩充自己的知识,希望大家可以继续支持,什么时候粉丝能到300啊。pythonopencv安装_一起学opencv-python一(opencv安装和简介和图像和视频的读取与保存)..._第2张图片

你可能感兴趣的:(pythonopencv安装)