Part I 空气曲棍球 Chapter5 (5.1 We Have an Aspect Ratio Problem)

5.1 屏幕比例问题(We Have an Aspect Ratio Problem)

    现在我们知道在OpenGL里面所有渲染的东西在x轴及y轴上都限制在[-1,+1]范围内,z轴上也存在同样的限制。在这个范围内的坐标有一个特殊的称呼:规范化坐标空间,同时独立于屏幕的大小和形状。不幸的是因为独立于实际屏幕尺寸,假如我们直接使用这些坐标那将会产生一些问题,比如横屏模式下的挤压问题。
    假如有一个屏幕尺寸为1280 x 720,在Android上这是一个通用的屏幕分辨率。同时为了简单起见,假设使用整个屏幕进行显示。如果我们的设备是竖屏模式,[-1, +1]将会映射到屏幕的1280像素高度,但是宽度只有720像素。这样的话图像在显示的时候就会产生挤压问题。
    规范化设备坐标假定坐标空间是正方形的,下如下图所示:

    然而,由于实际的视口(viewport)可能并不是正方形的,这时图片会在一个方向拉伸而在另一个方向产生挤压。当一张图片显示在竖屏模式下的规范化设备空间时将会在水平方向上产生挤压,如下图所示:

    同样的,当在横屏模式下时,将会在垂直方向上产生挤压,如下图所示:


 5.1.1 调整屏幕比例(Adjusting to the Aspect Ratio)


    我们需要考虑屏幕形状以调整坐标空间,一种方法是把尺寸较小的一边规范化到[-1, +1],同时根据屏幕尺寸调整较大边的比例。
    举个例子:比如在竖屏模式下,宽度是720,高度是1280,我们仍然把宽度映射到[-1, 1],高度规范化到[-1280/720,
1280/720] or [-1.78, 1.78]。当在横屏模式下时,把宽度映射到[-1.78, 1.78],高度映射到[-1, 1]。
    通过改变坐标空间,我们可以改变已有的OpenGL绘制范围,这样的话图像在竖屏和横屏模式下都会保持同样的显示效果,如下图所示:    

 

下一节我们将学习虚拟坐标空间。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Eye aspect ratio(EAR)是一种度量眼睛疲劳或睡眠状态的方法。它通过测量眼睑的开合程度来计算,以下是如何使用EAR的步骤: 1. 安装dlib和opencv库,并导入相关库。 ```python import cv2 import dlib from scipy.spatial import distance ``` 2. 定义EAR函数,计算眼睛的EAR值。 ```python def eye_aspect_ratio(eye): # 计算垂直方向上的两个点之间的距离 A = distance.euclidean(eye[1], eye[5]) B = distance.euclidean(eye[2], eye[4]) # 计算水平方向上的一个点到另一个点之间的距离 C = distance.euclidean(eye[0], eye[3]) # 计算EAR值 ear = (A + B) / (2.0 * C) return ear ``` 其中,eye是一个包含6个点的元组,表示眼睛的六个关键点,分别是: - 左眼:(36, 37, 38, 39, 40, 41) - 右眼:(42, 43, 44, 45, 46, 47) 3. 加载人脸检测器和眼睛检测器,并使用它们来检测眼睛的位置。 ```python detector = dlib.get_frontal_face_detector() predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat') # 打开摄像头 cap = cv2.VideoCapture(0) while True: # 读取摄像头画面 ret, frame = cap.read() # 转换为灰度图像 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 检测人脸 faces = detector(gray, 0) for face in faces: # 检测眼睛 leftEye = [] rightEye = [] landmarks = predictor(gray, face) for n in range(36, 48): x = landmarks.part(n).x y = landmarks.part(n).y if n < 42: leftEye.append((x, y)) else: rightEye.append((x, y)) # 计算EAR值 leftEAR = eye_aspect_ratio(leftEye) rightEAR = eye_aspect_ratio(rightEye) # 绘制眼睛区域 cv2.polylines(frame, [leftEye], True, (0, 255, 0), 1) cv2.polylines(frame, [rightEye], True, (0, 255, 0), 1) # 显示EAR值 cv2.putText(frame, "Left EAR: {:.2f}".format(leftEAR), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) cv2.putText(frame, "Right EAR: {:.2f}".format(rightEAR), (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) # 显示画面 cv2.imshow('frame', frame) # 按q键退出 if cv2.waitKey(1) & 0xFF == ord('q'): break # 释放摄像头 cap.release() cv2.destroyAllWindows() ``` 4. 运行程序,摄像头会打开并显示画面,同时会显示眼睛的EAR值和眼睛区域的轮廓。如果EAR值过低,表示眼睛疲劳或睡眠不足,需要休息一下。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值