关于OpenCV的简单使用

OpenCV(Open Source Computer Vision Library)

是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。OpenCV由一系列C/C++语言编写的函数和类组成,同时也支持Python和其他语言的接口。

opencv的基础图像操作

import cv2
#读取、显示图像
data = cv2.imread("qq.png")
cv2.imshow('QQ',data)
cv2.waitKey(0)
# 保存图像
cv2.imwrite("qq2.png",data)

绘制几何图形

# 绘制直线:cv2.line(img,start,end,color,thickness)
cv2.line(data, (100, 100), (200, 200), (0, 0, 255), 2)
# 绘制圆形 cv.circle(img,centerpoint, r, color, thickness)
cv2.circle(data, (300, 200), 100, (1, 11, 111))
# 绘制矩形cv.rectangle(img,leftupper,rightdown,color,thickness)
cv2.rectangle(data, (150, 150), (250, 250), (0, 0, 255), 2)
# 向图像中添加文字putText(img,text,station, font, Fontscale ,color,thickness,cv2.LINE_AA)
cv2.putText(data,"QQqqQQ",(180,50),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
# 获取并修改图像中的像素点
data2 = data[100,100]
print(data2)
data[100,100] = [0,255,0]

计算机中的图像

1. 像素(Pixel)

  • 像素是图像的基本单元,存储颜色、亮度等特征。
  • 图像由一系列像素组成,每个像素以二进制格式存储。

2. 图像类型

  • RGB图像:使用红(R)、绿(G)、蓝(B)三种颜色通道表示,可以组合出几乎所有颜色。
  • 二值图像:仅包含0和1两个像素值,代表黑色和白色,适用于OCR和掩膜图像存储。
  • 灰度图像:每个像素只有一个颜色采样,显示从黑色到白色的不同灰度。通常使用8位非线性尺度保存,可表示256级灰度。
  • 彩色图像:每个像素由RGB三个分量表示,数据类型通常为8位无符号整形,用于表示真彩色图像。

灰度实验

# 最大值法
data_shape = data.shape
data_arr = np.zeros((data_shape[0], data_shape[1]),dtype=np.uint8)
for i in range(data_shape[0]):
    for j in range(data_shape[1]):
        data_arr[i][j] = max(data[i, j][0], data[i, j][1], data[i, j][2])

# 平均值法
data_shape = data.shape
data_arr = np.zeros((data_shape[0], data_shape[1]), dtype=np.uint8)
for i in range(data_shape[0]):
    for j in range(data_shape[1]):
        data_arr[i][j] = (int(data[i, j][0]) + int(data[i, j][1]) + int(data[i, j][2])) / 3

# 加权均值法(内置)0.299R + 0.587G + 0.114*B
data_arr = cv2.cvtColor(data, cv2.COLOR_BGR2GRAY)

二值化实验

#阈值法
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_BINARY)

#反阈值法
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_BINARY——INV)

# 截断阈值法
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_TOZERO)

# 截断阈值法
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_TRUNC)

# 低阈值零处理
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_TOZERO)

# 超阈值零处理
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_TOZERO_INV)

# OTSU阈值法,自动图像阈值分割方法适用于将前景和背景分离
_,data_arr = cv2.threshold(data,127,255,cv2.THRESH_OTSU)

自适应二值化

adaptiveThreshold 的关键参数:

  • src: 输入图像,必须是单通道灰度图像。
  • maxValue: 二值化后的前景像素的最大值,通常设置为255。
  • adaptiveMethod: 自适应方法,可以是 cv2.ADAPTIVE_THRESH_MEAN_C (平均值)或 cv2.ADAPTIVE_THRESH_GAUSSIAN_C(加权值使用高斯正态分布)
  • thresholdType: 阈值类型,通常与 cv2.THRESH_BINARY 或 cv2.THRESH_BINARY_INV 结合使用。
  • blockSize: 考虑像素邻域的大小,必须是奇数。
  • C: 常数,用于阈值计算,表示阈值偏移量。
import cv2

# 灰度读取图像
data = cv2.imread("qq.png", cv2.IMREAD_GRAYSCALE)

# 自适应二值化
data_arr = cv2.adaptiveThreshold(data, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 10)
data_arr2 = cv2.adaptiveThreshold(data, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 7, 10)

cv2.imshow('QQ1', data)
cv2.imshow('QQ2', data_arr)
cv2.imshow('QQ3', data_arr2)
cv2.waitKey(0)

练习:摄像头实时采集并渲染 自适应二值化图像

 把视频存入video.avi

import cv2

# 视频参数
fps = 30  # 帧率
frame_width = 640  # 视频宽度
frame_height = 480  # 视频高度
codec = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter("video.avi", codec, fps, (frame_width, frame_height))
cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    if not ret:
        break

    data = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    data_arr = cv2.adaptiveThreshold(data, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 7, 10)
    data_arr = cv2.merge((data_arr, data_arr, data_arr))
    cv2.imshow('video', data_arr)
    out.write(data_arr)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

 读取video.avi

import cv2

cap = cv2.VideoCapture("video.avi")
if not cap.isOpened():
    print("error")
    exit()

while True:
    ret, frame = cap.read()

    if not ret:
        print("Failed ")
        break

    cv2.imshow("video.avi", frame)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值