1,基本语法

环境:python3.6.6+numpy+opencv3

安装:没有详细编译,直接pip install opencv-python

矩阵和图片:

img=numpy.zeros((3,3),dtype=numpy.uint8)    #创建一个3*3的矩阵,每个像素用八位整数来表示
img=cv2.cvtColor(img,cv2.COLOR_GRAY2BGR) #把矩阵转换成bgr格式,bgr:blue,green,read通道,实际上是创建了一个3*3的小黑方块

读写图片:

image=cv2.imread("D:\\opencv/31.png")    #读取图片,格式转换,写出
cv2.imwrite("31.png",image)

转换图片:

image=cv2.imread("31.png",0)    #读取装换成灰度图,写出,后边的参数的含义如下
cv2.imwrite("any31.png",image)
"""
IMREAD_ANYCOLOR=4
IMREAD_ANYDEPTH=2
IMREAD_COLOR=1
IMREAD_GRAYSCALE=0 gray image
IMREAD_LOAD_GDAL=8
IMREAD_UNCHANGED=-1
"""

2,图像与原始字节之间的关系

灰度图:image[0,0]第一个值表示y轴,第二个表示x轴,合起来表示左上角第一个像素,灰度值为255。还可以表示成image.setitem((0,0),128)

彩图:image[0,0,0]第一个值y轴,第二个x轴,第三个表示颜色通道。对于左上角有蓝色像素的图而言,image[0,0]是[255,0,0]

数组转换成图像数据:

import numpy
import cv2
import os randomByteArray=bytearray(os.urandom(120000)) #生成一堆字节数组,可以理解为元素介于0-255之间
flatNumpyArray=numpy.array(randomByteArray) #bytearray是字节数组,py3特有的,把一堆数或字符串变成字节
#flatNumpyArray=numpy.random.randint(0,256,120000)这样也是可以的 grayImage=flatNumpyArray.reshape(300,400) #转换数组使之成为300*400的灰度图
cv2.imwrite("randomgray.png",grayImage)
"""字节,
一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十
进制。最小值:0 最大值:255 。如一个ASCII码就是一个字节,此类单位的换算为: 1KB(Kilobyte 千
字节)=1024B,1MB(Megabyte 兆字节 简称“兆”)=1024KB,1GB(Gigabyte 吉字节 又称“千兆”)=1024MB,""" bgrImage=flatNumpyArray.reshape(100,400,3) #把数组转换成100*400有三个通道的彩图
cv2.imwrite("randoncolor.png",bgrImage)

通过操作数组来编辑图

import numpy as np
import cv2 as cv img=cv.imread("31.png")
img[0,0]=[255,255,255] #[255,255,255] bgr三个通道合起来是白色,把左上第一个像素变成白色 print(img.item(100,0,0)) #打印出图片中坐标为(100,0)的b通道值(g对应的是1,r对应的是2)
img.itemset((100,0,0),0) #把该像素的b通道设置为0
print (img.item(100,0,0)) #再次打印出来 #至此我们发现,我们可以迭代整个数组来实现为每个像素换颜色,但是这样并不高效,建议使用索引
img[:,:,1]=0 #把图像的每一个像素的g通道(绿色,对应的是1)的值都设置成0
cv.imwrite("test.png",img) #写下来的图片完全没有绿色 #通过复制数组,把图像的一个区域复制到另一个区域
apart=img[0:100,0:100] #俩区域要一样大
img[100:200,100:200]=apart
cv.imwrite('test1.png',img)

获取图像的属性


import cv2 as cv

img=cv.imread("31.png")
print (img.shape) #分辨率加通道数的数组(407, 500, 3)
print (img.size) #像素数乘以通道数
print (img.dtype) #图像的数据类型,比如uint

3,视频文件的读写

import cv2
videoCapture=cv2.VideoCapture("test.mp4") #先赋值视频文件以便获取各种参数
fps=videoCapture.get(cv2.CAP_PROP_FPS) #fps每秒传输的帧数
#此处是可以打出来的:print(fps)返回14
size=(int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT))) #获取宽和高
#此处也是可以打印出来的,基本上就是图片的长宽:print (size)
videoWriter=cv2.VideoWriter('myoutput.avi',cv2.VideoWriter_fourcc("I",'','',''),fps,size) #定义打印视频文件的打印器,写文件,参数分别是文件名,编解码器(下附详情),帧数和大小
#另注意,这个编码器是未压缩的yuv颜色编码
success,frame=videoCapture.read() #一帧一帧地读取videoCapture,如果成功的话继续执行
while success:
videoWriter.write(frame) #读到就用打印器写下来
success,frame=videoCapture.read() #重新赋值以便循环

视频编码器类型:

实时捕获摄像头的帧:

2.1.7

感谢《OpenCV3计算机视觉Python语言实现》这本书,感谢脚本之家。

opencv基础教程的更多相关文章

  1. opencv基础教程 之 图像基础和绘图

    1,教程:感谢小强 2,用argparse传参数来显示一张图片 #!/usr/bin/python #linux系统 #coding=utf-8 import cv2 import argparse ...

  2. 学习opencv中文版教程——第二章

    学习opencv中文版教程——第二章 所有案例,跑起来~~~然而并没有都跑起来...我只把我能跑的都尽量跑了,毕竟看书还是很生硬,能运行能出结果,才比较好. 越着急,心越慌,越是着急,越要慢,越是陌生 ...

  3. 【OpenCV新手教程之十二】OpenCV边缘检測:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/25560901 作者:毛星云(浅墨) ...

  4. 【OpenCV新手教程第14】OpenCVHough变换:霍夫变换线,霍夫变换圆汇编

    本系列文章由@浅墨_毛星云 出品.转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26977557 作者:毛星云(浅墨) ...

  5. [OpenCV入门教程之十二】OpenCV边缘检测:Canny算子,Sobel算子,Laplace算子,Scharr滤波器合辑

    http://blog.csdn.net/poem_qianmo/article/details/25560901 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...

  6. 【OpenCV入门教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    http://blog.csdn.net/poem_qianmo/article/details/26977557 本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog ...

  7. 【OpenCV新手教程之十四】OpenCV霍夫变换:霍夫线变换,霍夫圆变换合辑

    本系列文章由@浅墨_毛星云 出品,转载请注明出处. 文章链接:http://blog.csdn.net/poem_qianmo/article/details/26977557 作者:毛星云(浅墨) ...

  8. matlab基础教程——根据Andrew Ng的machine learning整理

    matlab基础教程--根据Andrew Ng的machine learning整理 基本运算 算数运算 逻辑运算 格式化输出 小数位全局修改 向量和矩阵运算 矩阵操作 申明一个矩阵或向量 快速建立一 ...

  9. <<Bootstrap基础教程>> 新书出手,有心栽花花不开,无心插柳柳成荫

    并非闲的蛋疼,做技术也经常喜欢蛋疼,纠结于各种技术,各种需求变更,还有一个很苦恼的就是UI总是那么不尽人意.前不久自己开源了自己做了多年的仓储项目(开源地址:https://github.com/he ...

随机推荐

  1. Selenium 4即将发布:每个QA都应该知道的

    阅读原文 Simon Stewart(Selenium的创始成员)在班加罗尔的Selenium大会议上正式确认了Selenium4.0的发布日期和一些主要更新.我们先来提前了解一下Selenium 4 ...

  2. 在JavaScript中使用三目运算符时进行多个操作

    今天使用三目运算符时,刚好需要在false时进行两个操作,故测试并记录在三目运算符中使用多个操作的方式 例子如下: true ? (console.log(1),console.log(2), tes ...

  3. random使用方法

    random.random() 没有参数,选择0到1之间的随机浮点数 random.uniform(a, b) 生成指定范围内的随机浮点数如果a.b哪个大那个小都没关系,生成的都是在小的与大的之间的随 ...

  4. 说说我心中的Linux系统

    我不知道在阅读此篇文章的你,是一个什么样的人,或许你只是偶然看到此篇文章的路人,或许是对linux有兴趣但没接触过linux的圈外人,或许是已经入行没多久的菜鸟,或许是喜欢linux却学习不下去预备放 ...

  5. sqlalchemy 外键

    建表 from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() from sqlalchemy ...

  6. vue学习初探

    一.环境的搭建安装 VS Code vue开发环境的搭建 理解vue的脚手架 合适的cnpm版本

  7. JAVA基础知识回顾(面试资料)

    关于数据库知识和面试:https://www.cnblogs.com/yanqb/p/9894943.html 关于数据库知识和面试:https://www.cnblogs.com/yanqb/p/1 ...

  8. nodejs fs path

    内容详见我的gitHub: https://github.com/shangyueyue/ssy-utils/tree/master/src/nodejs/fs

  9. 关闭浏览器事件 onbeforeunload和onunload

    在做毕设的时候,需要在关闭浏览器的时候向后台服务器修改用户在线状态.首先讲一下 onbeforeunload 和 onunload(都是在刷新或关闭时调用) 的区别: (1)onbeforeunloa ...

  10. wx.request 使用数据

    小程序中,怎么使用wx.request返回的数据??? 在你的js页面中 主要是这句话 var that=this; 为什么呢?因为使用过jquery的ajax的朋友都知道.在ajax函数中的this ...