python小记(2) | 基于OpenCV的一个附加题

一、安装&问题

Pycharm中File->setting->Python Interpreter添加opencv-python及opencv-contrib-python,调用时直接import cv2即可。
我原来用的Pycharm版本是2018年的,点了更新之后注销快捷键Ctrl+/用不了了,解决方法是:File->Setting->Keymap,更改这个为自己的系统,比如我以前用的是Windows。
在这里插入图片描述

二、题目&代码

题目:使用opencv进行图像处理
描述:自行下载一张网络图片以.jpg格式保存(要求宽高均大于448);自行安装opencv(cv2)以及opencv-contrib;使用opencv读取.jpg格式的文件,并获取图片的宽、高信息;将img1进行镜像,且进行灰度处理得到img2,镜像轴为y轴;Img2进行中心裁剪,裁剪得到448*448的新图片img3;将img1与img2、img3打印出来,并将img2和img3保存到本地文件中。输入:本地读取图像img1;输出:打印img1、img2、img3将img2、img3保存在本地文件中。

import cv2
import numpy as np
def Image():
    # flags False显示灰度图像,True显示原图
    img1 = cv2.imread("C:\\Users\\*\\Pictures\\img1.jpg")  # 镜玄yyds啊啊啊啊啊!
    cv2.imshow(winname='img1',mat=img1)
    cv2.waitKey(2000)
    # cv2.namedWindow('img1',cv2.WINDOW_NORMAL)
    # 获取图片信息,输出高宽通道数
    height = img1.shape[0]
    width = img1.shape[1]
    print('该图像宽为:',width)
    print('该图像高为:',height)
    # 将img1进行水平镜像翻转(对称轴为y轴)
    # 图像的镜像翻转得到的图像与原图像构成的图像是一个轴对称图像
    img2 = cv2.flip(img1,1)  # 0 垂直镜像翻转,1 水平镜像翻转,-1 对角镜像反转
    # 灰度处理img2 令R=G=B
    img2 = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)
    cv2.imshow(winname='img2',mat=img2)
    cv2.waitKey(2000)
    img3 = img2[int(height/2-224):int(height/2+224), int(width/2-224):int(width/2+224)]   # 裁剪坐标为[y0:y1, x0:x1]
    cv2.imshow('img3',img3)
    cv2.imshow(winname='img3',mat=img3)
    cv2.waitKey(2000)
    # 打印图像矩阵
    print(img1,img2,img3)
    # # 多图同窗显示,要求图像通道大小必须相同
    # imgs = np.hstack((img1,img2,img3))
    imgs = ManyImgs(0.2,([img1,img2,img3])) # 结果伸缩变形,需要调整
    cv2.imshow('imgs',imgs)
    cv2.waitKey(1000)
    # 等待关闭
    # cv2.destroyWindow()
    # 调用函数
    cv2.imwrite('C:\\Users\\*\\Pictures\\img2.jpg',img2)
    cv2.imwrite('C:\\Users\\*\\Pictures\\img3.jpg',img3)

# 参考博文:《Opencv实现多幅图像显示在同一窗口(基于Python)》
# 链接:https://blog.csdn.net/qq_44703724/article/details/105613611?

# 定义函数,第一个参数是缩放比例,第二个参数是需要显示的图片组成的元组或者列表
def ManyImgs(scale, imgarray):
    rows = len(imgarray)         # 元组或者列表的长度
    cols = len(imgarray[0])      # 如果imgarray是列表,返回列表里第一幅图像的通道数,如果是元组,返回元组里包含的第一个列表的长度
    # print("rows=", rows, "cols=", cols)
    # 判断imgarray[0]的类型是否是list
    # 是list,表明imgarray是一个元组,需要垂直显示
    rowsAvailable = isinstance(imgarray[0], list)

    # 第一张图片的宽高
    width = imgarray[0][0].shape[1]
    height = imgarray[0][0].shape[0]
    # print("width=", width, "height=", height)

    # 如果传入的是一个元组
    if rowsAvailable:
        for x in range(0, rows):
            for y in range(0, cols):
                # 遍历元组,如果是第一幅图像,不做变换
                if imgarray[x][y].shape[:2] == imgarray[0][0].shape[:2]:
                    imgarray[x][y] = cv2.resize(imgarray[x][y], (0, 0), None, scale, scale)
                # 将其他矩阵变换为与第一幅图像相同大小,缩放比例为scale
                else:
                    imgarray[x][y] = cv2.resize(imgarray[x][y], (imgarray[0][0].shape[1], imgarray[0][0].shape[0]), None, scale, scale)
                # # 如果图像是灰度图,将其转换成彩色显示
                # if  len(imgarray[x][y].shape) == 2:
                #     imgarray[x][y] = cv2.cvtColor(imgarray[x][y], cv2.COLOR_GRAY2BGR)

        # 创建一个空白画布,与第一张图片大小相同
        imgBlank = np.zeros((height, width, 3), np.uint8)
        hor = [imgBlank] * rows   # 与第一张图片大小相同,与元组包含列表数相同的水平空白图像
        for x in range(0, rows):
            # 将元组里第x个列表水平排列
            hor[x] = np.hstack(imgarray[x])
        ver = np.vstack(hor)   # 将不同列表垂直拼接
    # 如果传入的是一个列表
    else:
        # 变换操作,与前面相同
        for x in range(0, rows):
            if imgarray[x].shape[:2] == imgarray[0].shape[:2]:
                imgarray[x] = cv2.resize(imgarray[x], (0, 0), None, scale, scale)
            else:
                imgarray[x] = cv2.resize(imgarray[x], (imgarray[0].shape[1], imgarray[0].shape[0]), None, scale, scale)
            if len(imgarray[x].shape) == 2:
                imgarray[x] = cv2.cvtColor(imgarray[x], cv2.COLOR_GRAY2BGR)
        # 将列表水平排列
        hor = np.hstack(imgarray)
        ver = hor
    return ver
    
if __name__=='__main__':
	Image()

三、结果

镜玄yyds!!!眷思量我等着你更新!!!

在这里插入图片描述
img1.jpg
在这里插入图片描述
宽高及打印
在这里插入图片描述

img2.jpg
在这里插入图片描述
img3.jpg
在这里插入图片描述

利用ManyImgs()函数得到的图像有伸缩变形,需要修正。
在这里插入图片描述

### 回答1: 在写一个基于openCV的疲劳检测系统之前,您需要先安装openCV库。您可以使用以下命令安装它: ``` pip install opencv-python ``` 安装完成后,您就可以开始编写代码了。首先,您需要导入openCV库: ```python import cv2 ``` 接下来,您需要使用openCV的特征检测模块来检测人脸。您可以使用以下代码载入人脸检测器: ```python face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml') ``` 然后,您可以使用以下代码来检测人脸: ```python gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30)) ``` 接下来,您可以使用预先训练的模型来检测眼睛。您可以使用以下代码载入眼睛检测器: ```python eye_cascade = cv2.CascadeClassifier('haarcascade_eye.xml') ``` 然后,您可以使用以下代码来检测眼睛: ```python for (x, y, w, h) in faces: roi_gray = gray[y:y+h, x:x+w] eyes = eye_cascade.detectMultiScale(roi_gray) if len(eyes) == 0: # 如果没有检测到眼睛,则认为此人疲劳 print("The person is tired") else: # 如果检测到眼睛,则认为此人不疲劳 print("The person is not tired") ``` 最后,您可 ### 回答2: 基于OpenCV的疲劳检测系统使用Python编写。首先,需要安装OpenCVPython的相关库。接下来,我们可以通过在摄像头捕捉的实时视频流中检测眼睛的闭合来判断疲劳程度。 实现该系统的主要步骤如下: 1. 导入所需的库:引用OpenCV以及其他需要的库,如numpy、dlib等。 2. 加载人脸检测器:使用dlib库的特征预测器加载一个已经训练好的人脸检测器。 3. 捕获实时视频:利用OpenCV从摄像头中捕获实时视频流,并初始化相关变量。 4. 人脸检测与特征预测:通过人脸检测器检测到人脸后,利用dlib库的特征预测器定位眼睛的位置。 5. 眼睛状态检测:利用眼睛的特征点进行计算,判断眼睛是否闭合。如果眼睛闭合的时间超过一定的阈值,即判断为疲劳状态。 6. 显示结果:根据眼睛状态进行结果展示,可以在实时视频流中用方框或文字标注出疲劳状态。 需要注意的是,由于个体差异以及环境光线等因素的干扰,系统的准确度可能存在一定的误差。因此,在实际使用中,建议结合其他疲劳检测指标一起评估个体的疲劳程度。 通过以上步骤,我们可以编写一个简单的基于OpenCV的疲劳检测系统,用于实时检测个体的疲劳情况,并提供及时的警示或提醒。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

月婵婵

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值