颜色空间转换
# 转换颜色空间 BGR 到 HSV
hsv = cv.cvtColor(frame, cv.COLOR_BGR2HSV)
注:RGB 颜色空间是颜色空间,即三基色空间,任何一种颜色都可以由该三种 颜色混合而成。然而一般对颜色空间的图像进行有效处理都是在 HSV 空间进行的,HSV(色调 Hue,饱和度 Saturation,亮度 Value)是根据颜色的直观特性创建的一种颜色空间, 也称六角锥体模型。h这一个参数就能确定颜色
例程:(得自官方文档和chatgpt)
RGB空间:
import numpy as np
import cv2 as cv
def nothing(x):
pass
# 创建一个黑色的图像,一个窗口
img = np.zeros((300,512,3), np.uint8)
cv.namedWindow('image')
# 创建颜色变化的轨迹栏
cv.createTrackbar('R','image',0,255,nothing)
cv.createTrackbar('G','image',0,255,nothing)
cv.createTrackbar('B','image',0,255,nothing)
# 为 ON/OFF 功能创建开关
switch = '0 : OFF \n1 : ON'
cv.createTrackbar(switch, 'image',0,1,nothing)
while(1):
cv.imshow('image',img)
k = cv.waitKey(1) & 0xFF
if k == 27:
break
# 得到四条轨迹的当前位置
r = cv.getTrackbarPos('R','image')
g = cv.getTrackbarPos('G','image')
b = cv.getTrackbarPos('B','image')
s = cv.getTrackbarPos(switch,'image')
if s == 0:
img[:] = 0
else:
img[:] = [b,g,r]
cv.destroyAllWindows()
HSV空间
import numpy as np
import cv2 as cv
def nothing(x):
pass
# 创建一个黑色的图像和一个窗口
img = np.zeros((300, 512, 3), np.uint8)
cv.namedWindow('image')
# 创建颜色变化的轨迹条
cv.createTrackbar('Hue', 'image', 0, 179, nothing) # Hue的范围是0-179
cv.createTrackbar('Saturation', 'image', 0, 255, nothing)
cv.createTrackbar('Value', 'image', 0, 255, nothing)
while True:
# 将 HSV 值都设置为轨迹条的当前位置
h = cv.getTrackbarPos('Hue', 'image')
s = cv.getTrackbarPos('Saturation', 'image')
v = cv.getTrackbarPos('Value', 'image')
img[:] = [h, s, v]
# 将 HSV 转换为 BGR
hsv_img = np.array([[[h, s, v]]], dtype=np.uint8)
bgr_img = cv.cvtColor(hsv_img, cv.COLOR_HSV2BGR)
# 显示图像
cv.imshow('image', bgr_img)
k = cv.waitKey(1) & 0xFF
if k == 27: # 按下 ESC 键退出
break
cv.destroyAllWindows()
对摄像头进行校准
import numpy as np
import cv2
# 设置棋盘格大小和棋盘格角点数目
board_size = (9, 6)
square_size = 0.025 # 棋盘格方块长度,单位为米
# 准备棋盘格世界坐标系下的坐标
objp = np.zeros((board_size[0] * board_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:board_size[0], 0:board_size[1]].T.reshape(-1, 2) * square_size
# 储存棋盘格角点的世界坐标和图像坐标对
world_points = []
image_points = []
# 获取摄像头对象
cap = cv2.VideoCapture(0)
while True:
# 读取一帧图像
ret, img = cap.read()
# 将图像转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 寻找棋盘格角点
ret, corners = cv2.findChessboardCorners(gray, board_size, None)
# 如果找到了棋盘格角点
if ret == True:
world_points.append(objp)
image_points.append(corners)
# 在图像上绘制棋盘格角点
cv2.drawChessboardCorners(img, board_size, corners, ret)
# 显示图像
cv2.imshow('img', img)
# 如果采集到了足够的角点对,就停止采集
if len(world_points) >= 15:
break
# 等待用户按下 ESC 键
k = cv2.waitKey(1) & 0xFF
if k == 27:
break
# 计算相机的内部参数和畸变系数
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(world_points, image_points, gray.shape[::-1], None, None)
# 打印出相机的内部参数和畸变系数
print("相机内部参数:")
print(mtx)
print("相机畸变系数:")
print(dist)
np.save('cameraMatrix.npy', mtx)
np.save('distCoeffs.npy', dist)
# 释放摄像头对象和窗口
cap.release()
cv2.destroyAllWindows()