opencv的基本操作, 绘制几何图形

1.基本操作

1.1 读取图像

cv2.imread(path,[读取方式])

参数:

  • path:要读取的图像路径
  • 读取方式的标志(彩色-默认,灰色等等)

参考代码:

import cv2
import numpy as np
# 读取图像
img=cv2.imread(r"./src/1.jpg")
print(img)
'''
[[[246 246 246]
  [246 246 246]
  [246 246 246]
  ...
  ...
  ...
  [246 246 246]
  [246 246 246]
  [246 246 246]]]
'''
print(img.shape,type(img),img.de)#(651, 650, 3) <class 'numpy.ndarray'>

说明图像可以以数据类型为uint8数组的形式输出

1.2 显示图像

cv2.imshow(arg1,arg2)
参数:
arg1:显示图像的窗口名称,以字符串类型表示
arg2:要加载的图像

注意:在调用显示图像的API后,要调用cv2.waitKey(0)给图像绘制留下时间,否则窗口会出现无响应情况,并且图像无法显示出来

# 显示图像
cv2.imshow('img',img) #第一个参数窗口名称 第二个参数为要显示的图像
cv2.waitKey(0) #让图像在屏幕上停留的时间(单位毫秒) 0:表示的是让图像永久暂停在屏幕上
  • cv2.waitKey() 表示让图像在屏幕上停留的时间(单位毫秒) 0:表示的是让图像永久暂停在屏幕上

1.3.保存图像

cv2.imwrite(arg1,arg2)

参数:

  • arg1:文件名,要保存在哪里
  • arg2:要保存的图像
# 显示图像
cv2.imshow('img',img) #第一个参数窗口名称 第二个参数为要显示的图像

#保存图像
cv2.imwrite(r"./src/0.jpg",img)
cv2.waitKey(0) #让图像在屏幕上停留的时间(单位毫秒) 0:表示的是让图像永久暂停在屏幕上

2.绘制几何图形

2.1 1.绘制直线

cv2.line(img,start,end,color,thickness)

扫描二维码关注公众号,回复: 17795739 查看本文章

参数:

  • img:要绘制直线的图像
  • Start,end: 直线的起点和终点
  • color: 线条的颜色
  • Thickness: 线条宽度
#绘制直线
cv2.line(img,(100,10),(150,100),(255,255,0),2)
#参数分别为要操作的图像,直线的起始位置,直线的结束位置,颜色,粗细
cv2.imshow("img",img)
cv2.waitKey(0)

在这里插入图片描述

2.2 绘制圆形

cv.circle(img,centerpoint, r, color, thickness)

参数:

  • img:要绘制圆形的图像
  • Centerpoint, r: 圆心和半径
  • color: 线条的颜色
  • Thickness: 线条宽度,为-1时生成闭合图案并填充颜色(将是实心的)
# 绘制圆形
h,w,c=img.shape #分别是图像的高,宽,和颜色

cv2.circle(img,(int(h/2),int(w/2)),100,(0,255,255),-1)
cv2.imshow("img",img)
cv2.waitKey(0)

在这里插入图片描述

2.3绘制矩形

cv.rectangle(img,leftupper,rightdown,color,thickness)

参数:

  • img:要绘制矩形的图像
  • Leftupper, rightdown: 矩形的左上角和右下角坐标
  • color: 线条的颜色
#绘制矩形
cv2.rectangle(img,(100,100),(300,400),(255,255,0),2)
cv2.imshow("img",img)
cv2.waitKey(0)

在这里插入图片描述

2.4.向图像中添加文字

cv.putText(img,text,station, font, Fontscale ,color,thickness,cv2.LINE_AA)

参数:

  • img: 图像

  • text:要写入的文本数据(opencv不提供中文编码)

  • station:文本的放置位置

  • font:字体样式

  • Fontscale :字体大小

  • thickness字体线条宽度

  • cv2.LINE_AA

    最后一个参数 cv2.LINE_AA 表示使用反走样(Anti-Aliasing)技术来绘制文本边框。

    • 反走样是一种提高图形质量的技术,它通过混合颜色和像素边缘以减少锯齿状效果,使文本看起来更加平滑、清晰。
    • 在 OpenCV 中,cv2.LINE_AA 是一种高级线条类型,用于实现文本边界的高质量渲染。相比于其他线型如 cv2.LINE_8(默认值),它能提供更好的视觉效果,特别是在文本较小或者需要高精度显示的情况下
  '''绘制文本'''
    img=cv2.imread(r"./src/1.jpg")
    #参数分别为要操作的图像,文本,文本的位置,文本的字体,文本的大小,颜色,线条粗细,文本的圆滑程度
    cv2.putText(img,'hello',(100,150),cv2.FONT_ITALIC,5,(255,255,0),10,cv2.LINE_AA)

    cv2.imshow("img",img)
    cv2.waitKey(0)

在这里插入图片描述

2.5 获取并修改图像中的像素点

'''获取并修改图像中的像素点'''
    img=cv2.imread(r"./src/1.jpg")
    # 获取某个像素点的值
    px=img[100,100]#[246 246 246] 表示这个像素点的BGR三原色
    print(px)
    # 改变图像中的像素点
    img[100,:]=[0,0,255]
    cv2.imshow('img',img)
    cv2.waitKey(0)

在这里插入图片描述
取出图像像素点就像是numpy中取出数组索引,而修改就是对数组进行索引修改或者切片修改

6.捕获摄像头的实时视频流

cap = cv2.VideoCapture(path)

path视频流资源路径设置为0代表从默认摄像头捕获视频流

ret, frame = cap.read()(获取的是视频中每一帧的图片)
60帧=cv2.waitKey((1000毫秒)/60)

返回值cap 调用read()方法可以得到一个布尔值和一帧图像。布尔值表示是否成功读取到帧,如果为False,可能是因为视频结束或读取失败;如果为True,第二项则是当前帧的图像数据。

'''捕获摄像头的实时视频流'''
    path=0#r'./src/谁.mp4'#获取视频的地址 0表示获取本地摄像头
    cap=cv2.VideoCapture(path) #获取视频

    
    while True:
        # 获取视频每一帧的图像
        ret,img=cap.read() #ret 表示是否获取到视频的图像
    # 视频是每一帧图片在一定时间暂停下,循环迭代出来的
        if ret:
            cv2.imshow("img",img)
            if cv2.waitKey(20)&0xff==ord('q'):
                break
        else:
            break