【OpenCV基础2】图像运算、水印、加密、摄像头

目录

一、图像运算

1、利用"+"

2、cv2.add()

3、掩膜异或

二、摄像头

1、读取、视频流保存

2、人脸识别

三、数字水印

1、水印嵌入

​2、水印提取

四、图像加密


一、图像运算

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()
相关推荐
深蓝易网9 分钟前
打破传统仓库管理困局:WMS如何重构出入库全流程
大数据·运维·人工智能·重构·数据分析·制造
FF-Studio29 分钟前
【硬核数学】2. AI如何“学习”?微积分揭秘模型优化的奥秘《从零构建机器学习、深度学习到LLM的数学认知》
人工智能·深度学习·学习·机器学习·自然语言处理·微积分·高等数学
仙人掌_lz30 分钟前
深入理解蒙特卡洛树搜索(MCTS):python从零实现
人工智能·python·算法·ai·强化学习·rl·mcts
追逐☞33 分钟前
机器学习(14)——模型调参
人工智能·机器学习
犬余35 分钟前
告别Spring AI!我的Java轻量AI框架实践(支持多模型接入|注解式MCP架构|附开源地址)
java·人工智能·spring
Ro小陌44 分钟前
VisionPro自动化视觉开发实战:脚本编写、规范管理与高级调试
人工智能·microsoft·自动化
水花花花花花1 小时前
离散文本表示
人工智能·机器人
Thanks_ks1 小时前
Manus AI 突破多语言手写识别技术壁垒:创新架构、算法与应用解析
人工智能·迁移学习·应用场景·技术突破·多语言手写识别·manus ai·动态书写模型
whaosoft-1431 小时前
w~自动驾驶合集1
人工智能
白熊1881 小时前
【通用智能体】Lynx :一款基于终端的纯文本网页浏览器
前端·人工智能·chrome·通用智能体