目录
一、图像运算
1、利用" +"
python
import cv2
'''
利用"+"方法将两幅图像相加
'''
img1 = cv2.imread('project_demo/class_picture/2.jpeg')
img2 = cv2.imread('project_demo/class_picture/3.jpeg')
height1, width1 = img1.shape[:2]
img2 = cv2.resize(img2, (width1, height1))
img4 = img1 + img2
cv2.imshow('img4', img4)
cv2.waitKey(0)
cv2.destroyAllWindows()

2、cv2.add()
python
import cv2
'''
利用cv2.add()方法将两幅图像相加
'''
img1 = cv2.imread('project_demo/class_picture/2.jpeg')
img2 = cv2.imread('project_demo/class_picture/3.jpeg')
height1, width1 = img1.shape[:2]
img2 = cv2.resize(img2, (width1, height1))
img3 = cv2.add(img1, img2)
cv2.imshow('img3', img3)
cv2.waitKey(0)
cv2.destroyAllWindows()

3、掩膜异或
python
'''
将 lena_gray.jpg 以单通道方式读入,然后生成两个与该图片一样大的掩膜,其中
a) mask的像素为全零
b) mask的像素为全255
尝试将单通道的lena图像与两个掩膜进行异或操作
'''
img = cv2.imread('project_demo/class_picture/lena_gray.jpg', 0)
mask = np.zeros_like(img)
mask2 = np.ones_like(img) * 255
masked_img = cv2.bitwise_xor(img, mask)
masked_img2 = cv2.bitwise_xor(img, mask2)
cv2.imshow('masked_img', masked_img)
cv2.imshow('masked_img2', masked_img2)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、摄像头
1、读取、视频流保存
python
'''
编写Python脚本,使用OpenCV库打开摄像头。
捕获摄像头视频流,并分别使用OpenCV或ffmpeg等工具将视频保存为I420、XVID和MP4V格式
'''
import cv2
import numpy as np
def create_video_writer(filename, fourcc, fps, frame_size):
"""创建视频写入器"""
return cv2.VideoWriter(filename, fourcc, fps, frame_size)
cap = cv2.VideoCapture(0)
# 获取视频的基本信息
fps = 60.0 # 设置帧率
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
frame_size = (frame_width, frame_height)
# 创建不同格式的视频写入器
i420_writer = create_video_writer('project_demo/output_i420.avi',
cv2.VideoWriter_fourcc(*'I420'),
fps, frame_size)
xvid_writer = create_video_writer('project_demo/output_xvid.avi',
cv2.VideoWriter_fourcc(*'XVID'),
fps, frame_size)
mp4v_writer = create_video_writer('project_demo/output_mp4v.mp4',
cv2.VideoWriter_fourcc(*'MP4V'),
fps, frame_size)
print("开始录制视频,按'q'键停止...")
while True:
# 读取一帧
ret, frame = cap.read()
if not ret:
print("无法获取摄像头画面")
break
# 写入各个格式的视频文件
i420_writer.write(frame)
xvid_writer.write(frame)
mp4v_writer.write(frame)
# 显示实时预览
cv2.imshow('Video Recording', frame)
# 按'q'键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
print("录制结束")
break
# 释放所有资源
cap.release()
i420_writer.release()
xvid_writer.release()
mp4v_writer.release()
cv2.destroyAllWindows()
2、人脸识别
python
'''
用OpenCV捕获摄像头视频流,并调整每一帧图像的分辨率为1024x768。
加载人脸检测的分类器(如Haar级联分类器或深度学习模型)。
对每一帧图像进行人脸检测。
在检测到的人脸周围绘制蓝色矩形框进行标注。
显示标注后的图像
'''
import cv2
# 加载Haar级联分类器
face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
# 读取一帧
ret, frame = cap.read()
if not ret:
print("无法获取摄像头画面")
break
# 调整分辨率为1024x768
frame = cv2.resize(frame, (1024, 768))
# 转换为灰度图像
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 人脸检测
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 绘制蓝色矩形框
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 显示标注后的图像
cv2.imshow('Face Detection', frame)
# 按'q'键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
三、数字水印
1、水印嵌入
python
'''
读取原始图像(如lean_gray.jpg或lena_gray.jpg)和水印图像(如treasure1.jpeg或1.jpeg)。
对水印图像进行预处理,如缩小尺寸、灰度化、二值化等。
选择嵌入位置或策略(如LSB最低有效位法),将水印信息嵌入到原始图像的像素中。
保存嵌入水印后的图像。
'''
import cv2
import numpy as np
def embed_watermark(original_image_path, watermark_image_path, output_image_path):
# 读取原始图像和水印图像
original_img = cv2.imread(original_image_path, cv2.IMREAD_GRAYSCALE)
watermark_img = cv2.imread(watermark_image_path, cv2.IMREAD_GRAYSCALE)
# 调整水印图像大小与原始图像一致
watermark_img = cv2.resize(watermark_img, (original_img.shape[1], original_img.shape[0]))
# 二值化水印图像
_, watermark_img = cv2.threshold(watermark_img, 128, 255, cv2.THRESH_BINARY)
# 将水印嵌入到原始图像的最低有效位
embedded_img = np.bitwise_and(original_img, 0xFE) | (watermark_img >> 7)
# 保存嵌入水印后的图像
cv2.imwrite(output_image_path, embedded_img)
# 示例调用
embed_watermark('lean_gray.jpg', 'treasure1.jpeg', 'embedded_image.png')
2、水印提取
python
'''
读取嵌入水印后的图像。
根据嵌入策略,从图像的像素中提取出水印信息。
对提取出的水印进行后处理,如放大、灰度化等,以便于观察。
显示提取出的水印图像。
'''
import cv2
import numpy as np
def extract_watermark(embedded_image_path, output_watermark_path):
# 读取嵌入水印后的图像
embedded_img = cv2.imread(embedded_image_path, cv2.IMREAD_GRAYSCALE)
# 提取水印信息
extracted_watermark = np.bitwise_and(embedded_img, 0x01) * 255
# 保存提取出的水印
cv2.imwrite(output_watermark_path, extracted_watermark)
# 示例调用
extract_watermark('project_demo/class_picture/embedded_image.png',
'project_demo/class_picture/extracted_watermark.png')

四、图像加密
python
'''
加载图像并检测人脸:
使用OpenCV加载图像。
使用OpenCV自带的人脸检测器(如Haar级联分类器)检测人脸位置。
对人脸区域进行打码:
获取检测到的人脸区域坐标。
对该区域进行模糊处理,或使用其他加密手段(如马赛克、模糊、添加噪声等)。
保存打码后的图像:
保存处理后的图像,以便后续解码。
对打码图像进行解码:
加载打码后的图像。
重新检测人脸区域。
使用解码方法还原被打码的人脸区域(例如,使用预先保存的原始人脸区域进行替换)。
'''
import cv2
import numpy as np
img = cv2.imread("project_demo/class_picture/lena_color.jpg")
cv2.imshow("image",img)
mask = np.zeros(img.shape,np.uint8)
face = np.random.randint(0,255,(180,140,3))
mask[90:270,200:340,:] = face
img2 = cv2.bitwise_xor(img,mask)
cv2.imshow("image2",img2)
img3 = cv2.bitwise_xor(img2,mask)
cv2.imshow("image3",img3)
cv2.waitKey(0)
cv2.destroyAllWindows()
