赞
踩
目录
前言又来了,我是个菜鸡,不知道如何学习,所以我就采用大佬留下来的明路进行学习,并且加以整合。对Cv的学习,基本上是参考这位_Undo大佬的中文搬运 https://www.cnblogs.com/Undo-self-blog/p/8423851.html,以及这本书 OpenCV官方教程中文版(For Python)
可能我的教程会比较详细,也可能会比较简略,随缘咯.
读入图片主要靠这个:cv2.imread()
img = cv2.imread('test.jpg',1)
第一个参数是图片路径,不用说了。
第二个参数有三个选项:(这三个都是常量),这些代表啥意思,往下看,或者本文末。
• cv2.IMREAD_COLOR:1,读入一副彩色图像。图像的透明度会被忽略,这是默认参数。
• cv2.IMREAD_GRAYSCALE:0,以灰度模式读入图像
• cv2.IMREAD_UNCHANGED:-1,读入一幅图像,并且包括图像的 alpha 通道
我们输出一下看看:
- print(cv2.IMREAD_COLOR,cv2.IMREAD_GRAYSCALE,cv2.IMREAD_UNCHANGED)
- -----OUT-----
- 1 0 -1
当然,你可以用IDE的提示键入这些常量名,或者也可以像我这样的铁憨憨,直接背住常量值
函数返回一张图片(实际上是一个列表),可用print输出看看:
哇,这尼玛是什么东西?
这样输出看一哈:
- img=cv2.imread('test.jpg', 1)
- print(img[100,100])
- print(img[100])
- ----OUT------
- [241 215 179]
- [[255 255 255]
- [255 255 255]
- [255 255 255]
- ...
- [255 255 255]
- [255 255 255]
- [255 255 255]]
感觉像是个矩阵?再来换种方式的图片,变少了!
- img=cv2.imread('test.jpg', 0)
- print(img[100,100])
- print(img[100])
- ----OUT-------
- 207
- [255 255 255 ... 255 255 255]
其实这是RGB图和灰度图的差别,详细的在文章末尾
cv2.imshow('image',img)
第一个参数:就是你显示图片的窗口的标题,你可以显示无数个窗口,只要标题不一样就行
第二个参数:你要显示的图片
Like this ↓
无
为了防止程序结束,强行销毁窗口,我们加一个按键,程序会在我们按了任意键后,才会消失
- cv2.imshow('image',img)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
cv2.imwrite('messigray.png',img)
第一个参数 是文件的保存名,当然可以是绝对路径,也可以是相对路径。
第二个参数 是文件的内容,也就是图片嘛
第三个参数 没了解过,暂时用不到
无
一般通过,cap=cv2.VideoCapture()来打开一个摄像头,或者一个视频文件
参数可以是一个数字,代表着摄像头的设备号,笔记本默认为0吧。也可以是一个视频文件的地址
- cap = cv2.VideoCapture('test.mp4')
- cap = cv2.VideoCapture(0)
返回是一个视频对象
如果要退出,必须调用释放命令,我感觉如果不调用,就像一个线程没结束一样,占内存,所以最好还是加一下
cap.release()
一般是采用 ret, frame = cap.read()来读取一帧
无
第一个参数,布尔型,是否成功读入
第二个参数,是当前帧的一个图片,还是列表形式
我们要的是视频的一帧的图片,所以我们要的是第二个参数,但是如果只写一个参数,我们只能读到第一个参数,读不到后面的参数,所以必须写两个变量
为了控制视频的播放速率,在循环里面最好增加一个waitkey,来控制速率,过低视频变快,过高视频变慢
cv2.waitKey(18)
大家一般都是这样处理的:
- if cv2.waitKey(18) & 0xFF == ord('q'):
- break
用cap.get(propId)可以得当前的属性。
propld的值可以是从0~18,它的值含义如下,你也可以去书里找:
- • CV_CAP_PROP_POS_MSEC Current position of the video file in milliseconds.
- • CV_CAP_PROP_POS_FRAMES 0-based index of the frame to be decoded/captured next.
- • CV_CAP_PROP_POS_AVI_RATIO Relative position of the video file: 0 - start of the film, 1 - end of the film.
- • CV_CAP_PROP_FRAME_WIDTH Width of the frames in the video stream.
- • CV_CAP_PROP_FRAME_HEIGHT Height of the frames in the video stream.
- • CV_CAP_PROP_FPS Frame rate.
- • CV_CAP_PROP_FOURCC 4-character code of codec.
- • CV_CAP_PROP_FRAME_COUNT Number of frames in the video file.
- • CV_CAP_PROP_FORMAT Format of the Mat objects returned by retrieve() .
- • CV_CAP_PROP_MODE Backend-specific value indicating the current capture mode.
- • CV_CAP_PROP_BRIGHTNESS Brightness of the image (only for cameras).
- • CV_CAP_PROP_CONTRAST Contrast of the image (only for cameras).
- • CV_CAP_PROP_SATURATION Saturation of the image (only for cameras).
- • CV_CAP_PROP_HUE Hue of the image (only for cameras).
- • CV_CAP_PROP_GAIN Gain of the image (only for cameras).
- • CV_CAP_PROP_EXPOSURE Exposure (only for cameras).
- • CV_CAP_PROP_CONVERT_RGB Boolean flags indicating whether images should be converted to RGB.
- • CV_CAP_PROP_WHITE_BALANCE Currently unsupported
- • CV_CAP_PROP_RECTIFICATION Rectification flag for stereo cameras (note: only supported by DC1394 v 2.x backend currently)
一般用3,4可以读长宽
你参数是什么,返回的就是什么东西
cap.set(propId,value)
第一个参数:是你要修改的属性
第二个参数:属性的值
有一个布尔型的返回,用于反馈是否修改成功
视频保存的过程比较复杂,参数较多,而且我没有打算有保存视频的打算,所以不想详写,具体可以看书
参数我就不详说了,直接看。当然,所有的画线操作,均要在imshow之前完成。
cv2.line(img,(0,0),(511,511),(0,0,0),5)
img 图片
(0,0)直线的起点坐标
(511,511)终点坐标
(0,0,0)直线的RGB颜色或0~255灰度图颜色。读入的时候用的0,那么里面就因该是0~255;如果用的-1 或者 1 那就是(255,255,255)的一个元组
5 线的粗细
cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)
参照画线,两个坐标是左上角和右下角
cv2.circle(img,(447,63), 10, (0,0,255), -1)
(447,63)圆心
10半径
其他同理
cv2.ellipse(img,(256,256),(100,50),10,20,350,255,-1)
(256,256)中心点
(100,50)长轴短轴
10顺时针旋转角度
20顺时针开始画的扇形角度0~360
350顺时针结束画的扇形角度0~360
255颜色,同RGB或者灰度
-1填充。其他值不填充(不填充就是一条曲线)
- font = cv2.FONT_HERSHEY_SIMPLEX
- cv2.putText(img,'OpenCV',(10,500), font, 4,(255,255,255),2,cv2.LINE_AA)
• 你要绘制图片
• 你要绘制的文字
• 你要绘制的位置
• 字体类型(通过查看 cv2.putText() 的文档找到支持的字体)
• 字体的大小
• 文字的一般属性如颜色,粗细,线条的类型等。为了更好看一点推荐使用linetype=cv2.LINE_AA。
RGB图长得是以下的样子
其每一个点都是由一个像素点组成的,该像素点是由三个颜色混合而来,R G B 红 绿 蓝(色光三原色)。根据这三个色的占比不同,可以组成所有的颜色。单个取值均为0~255。
但是OpenCV用的是BGR图,所以交换下变量位置就行。
灰度图像这样
它只有三个"色"组成,白,黑,不同程度的灰
其中0是纯白 255是纯黑,值的不同,决定了灰色的不同。
灵魂画手康娜喵来了!
其实,可以理解成一个二维数组,也可以说是矩阵,安装Numpy就是为了矩阵运算。对不起,我线代不好,我啥都不知道。
一张图由这无数个像素点构成,他们则排成了一个数组。
比如我们用img[0] 则得到的是一行像素点的信息,如果在灰度图模式下,就是这样[255,255,……,255]。
如果我们img[0,0],则就是一个点的信息,那么在灰度图模式下,就是这样255。
同理,为什么在RGB图上面img[0] 会有两个括号?因为,每一个像素点的值,它不是一个值,而是一个元组,故相当于把灰度图的255替换成了[255,255,255],故能解释的通上文了。
自己理解一下吧
第一课嘛,基础知识多记牢一点,后面肯定不会这么详细了,这文章写了俩小时,真累。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。