【OpenCV基础2】
目录
一、图像运算
1、利用“+”
2、cv2.add()
3、掩膜异或
二、摄像头
1、读取、视频流保存
2、人脸识别
三、数字水印
1、水印嵌入
2、水印提取
四、图像加密
一、图像运算
1、利用“+”
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 + img2cv2.imshow('img4', img4)
cv2.waitKey(0)
cv2.destroyAllWindows()
2、cv2.add()
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、掩膜异或
'''
将 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脚本,使用OpenCV库打开摄像头。
捕获摄像头视频流,并分别使用OpenCV或ffmpeg等工具将视频保存为I420、XVID和MP4V格式
'''
import cv2
import numpy as npdef 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、人脸识别
'''
用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# 调整分辨率为1024x768frame = 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、水印嵌入
'''
读取原始图像(如lean_gray.jpg或lena_gray.jpg)和水印图像(如treasure1.jpeg或1.jpeg)。
对水印图像进行预处理,如缩小尺寸、灰度化、二值化等。
选择嵌入位置或策略(如LSB最低有效位法),将水印信息嵌入到原始图像的像素中。
保存嵌入水印后的图像。
'''
import cv2
import numpy as npdef 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、水印提取
'''
读取嵌入水印后的图像。
根据嵌入策略,从图像的像素中提取出水印信息。
对提取出的水印进行后处理,如放大、灰度化等,以便于观察。
显示提取出的水印图像。
'''
import cv2
import numpy as npdef 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')
四、图像加密
'''
加载图像并检测人脸:
使用OpenCV加载图像。
使用OpenCV自带的人脸检测器(如Haar级联分类器)检测人脸位置。
对人脸区域进行打码:获取检测到的人脸区域坐标。
对该区域进行模糊处理,或使用其他加密手段(如马赛克、模糊、添加噪声等)。保存打码后的图像:
保存处理后的图像,以便后续解码。
对打码图像进行解码:加载打码后的图像。
重新检测人脸区域。
使用解码方法还原被打码的人脸区域(例如,使用预先保存的原始人脸区域进行替换)。
'''
import cv2
import numpy as npimg = 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()