opencv-python:基础运用

本文详细介绍了使用OpenCV进行图像基础操作,包括图片的读写、摄像头信息获取、视频文件处理、鼠标回调、trackbar设置、颜色空间转换、图片索引修改、深浅拷贝、图片分离与合并、图形绘制以及图像和逻辑运算等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、测试基本功能

# 展示版本号
import cv2 as cv
print(cv.__version__)
# imread读取路径下的图片
# samples.findFile是提取图片路径
starry_night = cv.samples.findFile("D://dev/opencv/sources/samples/data/starry_night.jpg")
starry_night = cv.imread(starry_night)
cv.imshow("yang", starry_night)
cv.waitKey(0)

二、图片的读写

显示窗口
namedWindow(winname, flags)

flags窗口的创建模式
WINDOW_NORMAL窗口大小可以被用户调整,这是默认值
WINDOW_AUTOSIZE窗口大小会自动调整以适应显示的图像,用户不能手动改变窗口大小。
WINDOW_KEEPRATIO保持图像的宽高比
WINDOW_FREERATIO图像宽高比可以改变
WINDOW_GUI_EXPANDED窗口带有工具栏和状态栏
WINDOW_GUI_NORMAL窗口不带工具栏和状态栏

调整窗口大小
resizeWindow(winname, width, height)
读写图片
imread(“path”)
imwrite(“path”, image)
释放所有窗口
destroyAllWindows()

import cv2 as cv
cv.namedWindow("image", cv.WINDOW_NORMAL)
cv.resizeWindow("image", 752, 600)
image = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
cv.imshow("image", image)
while True:
    key = cv.waitKey(0)
    if key & 0xFF == ord('q'):
        break
    elif key & 0xFF == ord('s'):
        cv.imwrite("C://Users/36188/Desktop/starry_night_copy.png", image)
cv.destroyAllWindows()

三、尝试读取摄像头信息

import cv2 as cv
# 获得摄像头的分辨率
cap = cv.VideoCapture(0)
width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))

cv.namedWindow("video", cv.WINDOW_NORMAL)
cv.resizeWindow("video", width, height)
while True:
    # ret检测是否读取视频帧,frame接受读取的帧
    ret, frame = cap.read()
    cv.imshow("video", frame)
    key = cv.waitKey(1)
    if key & 0xFF == ord("q"):
        break
# 释放VideoCapture
cap.release()
cv.destroyAllWindows()

四、尝试读取本地视频文件

# 采集本地文件
import cv2 as cv
cap = cv.VideoCapture("D://dev/opencv/sources/samples/data/vtest.avi")
width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))

cv.namedWindow("video", cv.WINDOW_NORMAL)
cv.resizeWindow("video", width, height)
while True:
    # ret检测是否读取视频帧,frame接受读取的帧
    ret, frame = cap.read()
    if not ret:
        # 已播放完视频或者视频损坏
        break
    cv.imshow("video", frame)
    key = cv.waitKey(1)
    if key & 0xFF == ord("q"):
        break
# 释放VideoCapture
cap.release()
cv.destroyAllWindows()

五、保存视频文件

# 保存视频文件
import cv2 as cv
# 获取分辨率
cap = cv.VideoCapture(0)
width = int(cap.get(cv.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
# 创建窗口
cv.namedWindow("video", cv.WINDOW_NORMAL)
cv.resizeWindow("video", width, height)

fourcc = cv.VideoWriter_fourcc(*"MP4v")
vw = cv.VideoWriter("C://Users/36188/Desktop/out.mp4", fourcc, 25, (width, height))

while cap.isOpened():
    # ret检测是否读取视频帧,frame接受读取的帧
    ret, frame = cap.read()
    if ret:
        cv.imshow("video", frame)
        # 将窗口重置为width*height
        cv.resizeWindow("video", width, height)

        vw.write(frame)

        key = cv.waitKey(1)
        if key & 0xFF == ord("q"):
            break
    else:
        break

# 释放VideoCapture
# 释放VideoWriter
cap.release()
vw.release()
cv.destroyAllWindows()

六、鼠标回调函数

import cv2 as cv
import numpy as np


def mouse_callback(event, x, y, flags, userdata):
    print(event, x, y, flags, userdata)


cv.namedWindow("mouse", cv.WINDOW_NORMAL)
cv.resizeWindow("mouse", 640, 360)
# 设置鼠标回调
cv.setMouseCallback("mouse", mouse_callback, "userdata")
# 三层通道的零矩阵
img = np.zeros((360, 640, 3), dtype=np.uint8)
while True:
    cv.imshow("mouse", img)
    key = cv.waitKey(1)
    if key & 0xFF == ord("q"):
        break
cv.destroyAllWindows()

七、设置trackbar

import cv2 as cv
import numpy as np
# 创建一个三层通道零矩阵
img = np.zeros((480, 640, 3), np.uint8)


def callback(x):
    global r, g, b, img
    # 获得trackbar的值
    r = cv.getTrackbarPos("R", "trackbar")
    g = cv.getTrackbarPos("G", "trackbar")
    b = cv.getTrackbarPos("B", "trackbar")
    # 更改图片颜色
    img[:] = [b, g, r]


# 创建窗口
cv.namedWindow("trackbar", cv.WINDOW_NORMAL)
cv.resizeWindow("trackbar", 640, 480)
cv.createTrackbar("R", "trackbar", 0, 255, callback)
cv.createTrackbar("G", "trackbar", 0, 255, callback)
cv.createTrackbar("B", "trackbar", 0, 255, callback)

while True:
    cv.imshow("trackbar", img)

    key = cv.waitKey(10)
    if key & 0xFF == ord("q"):
        break
cv.destroyAllWindows()

八、对图片进行色域转换

import cv2 as cv
img = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
img2 = img


def callback(x):
    global index, img
    index = cv.getTrackbarPos("curcolor", "color")
    img = cv.cvtColor(img2, colorspaces[index])


cv.namedWindow("color", cv.WINDOW_NORMAL)
cv.resizeWindow("color", 752, 600)

colorspaces = [cv.COLOR_BGR2RGBA, cv.COLOR_BGR2GRAY,
               cv.COLOR_BGR2HSV_FULL, cv.COLOR_BGR2YUV]
cv.createTrackbar("curcolor", "color", 0, 3, callback)

while True:
    cv.imshow("color", img)
    key = cv.waitKey(10)
    if key & 0xFF == ord("q"):
        break
cv.destroyAllWindows()

九、利用图片索引修改

import cv2 as cv
import numpy as np

img = np.zeros((480, 640, 3), dtype=np.uint8)
cv.namedWindow("image", cv.WINDOW_NORMAL)
cv.resizeWindow("image", 640, 480)

count = 0
while count < 200:
    img[count, 100] = [0, 0, 255]
    count += 1
# 利用索引[y1:y2,x1:x2]
# img[0:200, 100] = [0, 0, 255]

cv.imshow("image", img)
key = cv.waitKey(0)
if key & 0xFF == ord("q"):
    cv.destroyAllWindows()

十、深拷贝和浅拷贝

import cv2 as cv
import numpy as np
# 浅拷贝,同步内容变更,只拷贝header部分,共享data部分
img = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
img2 = img
# 深拷贝,不同步内容变更,同时拷贝header和data部分
img3 = np.copy(img)

img[10:100, 10:100] = [0, 0, 255]
cv.imshow("img", img)
cv.imshow("img2", img2)
cv.imshow("img3", img3)
cv.waitKey(0)
# 用numpy的shape方法得到图片矩阵的形状
print(np.shape(img))
# 图片矩阵的大小等于宽×高×层数(通道数)
print(np.size(img))
# 图片矩阵的dtype参数,即图片的位深(8号无符号数)
print(img.dtype)

十一、图片的分离和合并

import cv2 as cv
import numpy as np

img = np.zeros((480, 640, 3), dtype=np.uint8)
# 分成三个通道,b, g, r分别存储三个通道的二维矩阵
b, g, r = cv.split(img)
# 修改部分值
b[10:100, 10:100] = 255
g[10:100, 10:100] = 255
# 将修改后的三通道合并为一个三层通道的图片
img2 = cv.merge((b, g, r))

cv.imshow("img", img)
cv.imshow("b", b)
cv.imshow("g", g)
cv.imshow("img2", img2)
cv.waitKey(0)

十二、利用opencv画图形

import cv2 as cv
import numpy as np
# 白色背景
img = 254 + np.zeros((480, 640, 3), dtype=np.uint8)
# 线line(img,起始点,终止点,颜色,线宽,线形(默认8,有4,8,16))
cv.line(img, (0, 0), (640, 480), (0, 0, 255), 5, 16)
# 矩形rectangle(img,起始点,终止点,颜色,填充度(-1是全填充))
cv.rectangle(img, (0, 0), (120, 200), (255, 0, 0), -1)
# 圆形circle(img,圆心,半径,颜色,填充度(-1是全填充))
cv.circle(img, (320, 240), 200, (0, 255, 0), -1)
# 椭圆ellipse(img,中心点,(a, b),角度,起始角度,终止角度,颜色,填充度)
# 角度是按顺时针算
cv.ellipse(img, (320, 240), (200, 150), 0, 0, 360, (0, 0, 255), -1)
# 自定义多边形,polylines(img,32位符号点集,是否连接,颜色,填充)
# 填充多边形,fillPoly(img,点集,颜色)
pts = np.array([(0, 0), (0, 480), (640, 480)], dtype=np.int32)
cv.polylines(img, [pts], True, (0, 0, 255))
cv.fillPoly(img, [pts], (255, 0, 0))
# 绘制文本putText(img,字符串,起始点,字体(0-7),字号,颜色)
cv.putText(img, "Hello World", (10, 400), 3, 3, (0, 0, 255))
cv.imshow("img", img)
cv.waitKey(0)

十三、鼠标在图片上绘制图形

import cv2 as cv
import numpy as np

curshape = 0
startpos = (0, 0)


def mouse_callback(event, x, y, flags, userdata):
    global curshape, startpos
    if event & cv.EVENT_LBUTTONDOWN == cv.EVENT_LBUTTONDOWN:
        startpos = (x, y)
    elif event & cv.EVENT_LBUTTONUP == cv.EVENT_LBUTTONUP:
        if curshape == 0:
            cv.line(img, startpos, (x, y), (0, 0, 255))
        elif curshape == 1:
            cv.rectangle(img, startpos, (x, y), (0, 0, 255))
        elif curshape == 2:
            radius = int(((x - startpos[0]) ** 2 +
                          (y - startpos[1]) ** 2) ** 0.5)
            cv.circle(img, startpos, radius, (0, 0, 255))
        else:
            print("error:no shape")


cv.namedWindow("drawshape", cv.WINDOW_NORMAL)
cv.setMouseCallback("drawshape", mouse_callback, "123")

img = np.zeros((480, 640, 3), dtype=np.uint8)
while True:
    cv.imshow("drawshape", img)
    key = cv.waitKey(1) & 0xFF
    if key == ord("q"):
        break
    # draw lines
    elif key == ord("l"):
        curshape = 0
    # draw rectangles
    elif key == ord("r"):
        curshape = 1
    # draw circles
    elif key == ord("c"):
        curshape = 2

cv.destroyAllWindows()

十四、图片运算

import cv2 as cv
import numpy as np

squirrel = cv.imread("D://dev/opencv/sources/samples/data/squirrel_cls.jpg")

img = np.ones(squirrel.shape, dtype=np.uint8) * 100
# 图片的加减法
result = cv.add(squirrel, img)
result2 = cv.subtract(result, img)
# 乘法除法同理
# cv.multiply(A, B)
# cv.divide(A, B)

# 图片相溶
img1 = cv.imread("D://dev/opencv/sources/samples/data/starry_night.jpg")
img2 = cv.imread("D://dev/opencv/sources/samples/data/small_cat.jpg")
# 图片属性相同
img3 = cv.addWeighted(img1, 0.3, img2, 0.7, 0)

cv.imshow("orig", squirrel)
cv.imshow("result", result)
cv.imshow("result2", result2)
cv.imshow("img3", img3)
cv.waitKey(0)

十五、图片逻辑运算

import cv2 as cv
import numpy as np

img = np.zeros((200, 200), dtype=np.uint8)
img2 = img.copy()
img3 = 254 + img2
img[50:150, 50:150] = 255

# NOT运算:bitwise_not
not_img = cv.bitwise_not(img)
# AND运算:bitwise_and
and_img = cv.bitwise_and(img, img2)
# OR运算:bitwise_or
or_img = cv.bitwise_or(img, img3)
# XOR同理
# 实例:为图片添加水印
small_cat = cv.imread("D://dev/opencv/sources/samples/data/small_cat.jpg")
logo = np.zeros((200, 200, 3), dtype=np.uint8)
mask = np.zeros((200, 200), dtype=np.uint8)
logo[20:120, 20:120] = [0, 0, 255]
logo[80:180, 80:180] = [0, 255, 0]
mask[20:120, 20:120] = 255
mask[80:180, 80:180] = 255
mask = cv.bitwise_not(mask)
roi = small_cat[0:200, 0:200]
# 抠出logo的位置,三通道与操作
tmp = cv.bitwise_and(roi, roi, mask=mask)
dst = cv.add(logo, tmp)
small_cat[0:200, 0:200] = dst

cv.imshow("img", img)
cv.imshow("not_img", not_img)
cv.imshow("and_img", and_img)
cv.imshow("or_img", or_img)
cv.imshow("small_cat", small_cat)
cv.waitKey(0)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

阿卡不吃秋葵

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

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

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

打赏作者

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

抵扣说明:

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

余额充值