PythonCV学习记录2——一些基本函数的整理

目录

零之前言

一.图片

1.读入图片

①参数

②返回

2.显示图片

①参数

②返回

③注意

3.保存图片

①参数

②返回

二.视频

1.加载视频

①参数

②返回

③注意

2.读视频一帧

①参数

②返回

③注意

3.读当前视频的属性

①参数

②返回

4.置当前视频的属性

①参数

②返回

5.保存视频

三.绘图

0.说明

1.画线

2.画矩形

3.画圆

4.椭圆

5.文字

四.补充知识

1.RGB图

2.灰度图

3.用元组表示图

五.后记


零之前言

前言又来了,我是个菜鸡,不知道如何学习,所以我就采用大佬留下来的明路进行学习,并且加以整合。对Cv的学习,基本上是参考这位_Undo大佬的中文搬运 https://www.cnblogs.com/Undo-self-blog/p/8423851.html,以及这本书 OpenCV官方教程中文版(For Python)

可能我的教程会比较详细,也可能会比较简略,随缘咯.

一.图片

1.读入图片

读入图片主要靠这个: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图和灰度图的差别,详细的在文章末尾

2.显示图片

cv2.imshow('image',img)

①参数

第一个参数:就是你显示图片的窗口的标题,你可以显示无数个窗口,只要标题不一样就行

第二个参数:你要显示的图片

Like this ↓

②返回

③注意

为了防止程序结束,强行销毁窗口,我们加一个按键,程序会在我们按了任意键后,才会消失

cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.保存图片

cv2.imwrite('messigray.png',img)

①参数

第一个参数 是文件的保存名,当然可以是绝对路径,也可以是相对路径。

第二个参数 是文件的内容,也就是图片嘛

第三个参数 没了解过,暂时用不到

②返回

二.视频

1.加载视频

一般通过,cap=cv2.VideoCapture()来打开一个摄像头,或者一个视频文件

①参数

参数可以是一个数字,代表着摄像头的设备号,笔记本默认为0吧。也可以是一个视频文件的地址

cap = cv2.VideoCapture('test.mp4')
cap = cv2.VideoCapture(0)

②返回

返回是一个视频对象

③注意

如果要退出,必须调用释放命令,我感觉如果不调用,就像一个线程没结束一样,占内存,所以最好还是加一下

cap.release()

2.读视频一帧

一般是采用 ret, frame = cap.read()来读取一帧

①参数

②返回

第一个参数,布尔型,是否成功读入

第二个参数,是当前帧的一个图片,还是列表形式

我们要的是视频的一帧的图片,所以我们要的是第二个参数,但是如果只写一个参数,我们只能读到第一个参数,读不到后面的参数,所以必须写两个变量

③注意

为了控制视频的播放速率,在循环里面最好增加一个waitkey,来控制速率,过低视频变快,过高视频变慢

cv2.waitKey(18)

大家一般都是这样处理的:

if cv2.waitKey(18) & 0xFF == ord('q'):
    break

3.读当前视频的属性

用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可以读长宽

②返回

你参数是什么,返回的就是什么东西

4.置当前视频的属性

cap.set(propId,value) 

①参数

第一个参数:是你要修改的属性

第二个参数:属性的值

②返回

有一个布尔型的返回,用于反馈是否修改成功

5.保存视频

视频保存的过程比较复杂,参数较多,而且我没有打算有保存视频的打算,所以不想详写,具体可以看书

三.绘图

0.说明

参数我就不详说了,直接看。当然,所有的画线操作,均要在imshow之前完成。

1.画线

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 线的粗细

2.画矩形

cv2.rectangle(img,(384,0),(510,128),(0,255,0),3)

参照画线,两个坐标是左上角和右下角

3.画圆

cv2.circle(img,(447,63), 10, (0,0,255), -1)

(447,63)圆心

10半径

其他同理

4.椭圆

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填充。其他值不填充(不填充就是一条曲线)

5.文字

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。

四.补充知识

1.RGB图

RGB图长得是以下的样子

其每一个点都是由一个像素点组成的,该像素点是由三个颜色混合而来,R G B 红 绿 蓝(色光三原色)。根据这三个色的占比不同,可以组成所有的颜色。单个取值均为0~255。

但是OpenCV用的是BGR图,所以交换下变量位置就行。

2.灰度图

灰度图像这样

它只有三个"色"组成,白,黑,不同程度的灰

其中0是纯白 255是纯黑,值的不同,决定了灰色的不同。

3.用元组表示图

灵魂画手康娜喵来了!

其实,可以理解成一个二维数组,也可以说是矩阵,安装Numpy就是为了矩阵运算。对不起,我线代不好,我啥都不知道。

一张图由这无数个像素点构成,他们则排成了一个数组。

比如我们用img[0] 则得到的是一行像素点的信息,如果在灰度图模式下,就是这样[255,255,……,255]。

如果我们img[0,0],则就是一个点的信息,那么在灰度图模式下,就是这样255。

同理,为什么在RGB图上面img[0] 会有两个括号?因为,每一个像素点的值,它不是一个值,而是一个元组,故相当于把灰度图的255替换成了[255,255,255],故能解释的通上文了。

自己理解一下吧

五.后记

第一课嘛,基础知识多记牢一点,后面肯定不会这么详细了,这文章写了俩小时,真累。

  • 9
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

康娜喵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值