讲解一下python的cv2.imshow()
时间: 2024-05-01 17:23:12 浏览: 123
`cv2.imshow()`是OpenCV库中用于显示图像的函数。该函数接受两个参数:窗口名称和图像对象。
在使用该函数前,需要创建一个窗口并指定窗口名称,可以使用`cv2.namedWindow()`函数进行创建。如果指定的窗口名称已经存在,则该函数不做任何操作。
示例代码:
```
import cv2
# 读取图像
img = cv2.imread('image.jpg')
# 创建窗口
cv2.namedWindow('image')
# 显示图像
cv2.imshow('image', img)
# 等待键盘输入
cv2.waitKey(0)
# 销毁窗口
cv2.destroyAllWindows()
```
在上述示例代码中,`cv2.namedWindow()`函数创建了一个名为`image`的窗口,然后使用`cv2.imshow()`函数将读取到的图像显示在该窗口中。`cv2.waitKey(0)`函数等待键盘输入,当用户按下任意键时,程序继续执行。最后,`cv2.destroyAllWindows()`函数销毁窗口并释放内存。
需要注意的是,在使用`cv2.imshow()`函数时,窗口名称必须与创建窗口时指定的名称一致,否则会出现显示不出图像的情况。
相关问题
import cv2 import mediapipe as mp import time class FaceDetector(): def __init__(self, minDetectionCon=0.5): self.minDetectionCon = minDetectionCon self.mpFaceDetection = mp.solutions.face_detection self.mpDraw = mp.solutions.drawing_utils self.faceDetection = self.mpFaceDetection.FaceDetection(self.minDetectionCon) def findFaces(self, img, draw=True): imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) self.results = self.faceDetection.process(imgRGB) # print(self.results) bboxs = [] if self.results.detections: for id, detection in enumerate(self.results.detections): bboxC = detection.location_data.relative_bounding_box ih, iw, ic = img.shape bbox = int(bboxC.xmin * iw), int(bboxC.ymin * ih), \ int(bboxC.width * iw), int(bboxC.height * ih) bboxs.append([id, bbox, detection.score]) if draw: img = self.fancyDraw(img,bbox) cv2.putText(img, f'{int(detection.score[0] * 100)}%', (bbox[0], bbox[1] - 20), cv2.FONT_HERSHEY_PLAIN, 2, (255, 0, 255), 2) return img, bboxs def fancyDraw(self, img, bbox, l=30, t=5, rt= 1): x, y, w, h = bbox x1, y1 = x + w, y + h cv2.rectangle(img, bbox, (255, 0, 255), rt) # Top Left x,y cv2.line(img, (x, y), (x + l, y), (255, 0, 255), t) cv2.line(img, (x, y), (x, y+l), (255, 0, 255), t) # Top Right x1,y cv2.line(img, (x1, y), (x1 - l, y), (255, 0, 255), t) cv2.line(img, (x1, y), (x1, y+l), (255, 0, 255), t) # Bottom Left x,y1 cv2.line(img, (x, y1), (x + l, y1), (255, 0, 255), t) cv2.line(img, (x, y1), (x, y1 - l), (255, 0, 255), t) # Bottom Right x1,y1 cv2.line(img, (x1, y1), (x1 - l, y1), (255, 0, 255), t) cv2.line(img, (x1, y1), (x1, y1 - l), (255, 0, 255), t) return img def main(): cap = cv2.VideoCapture("Videos/6.mp4") pTime = 0 detector = FaceDetector() while True: success, img = cap.read() img, bboxs = detector.findFaces(img) print(bboxs) cTime = time.time() fps = 1 / (cTime - pTime) pTime = cTime cv2.putText(img, f'FPS: {int(fps)}', (20, 70), cv2.FONT_HERSHEY_PLAIN, 3, (0, 255, 0), 2) cv2.imshow("Image", img) cv2.waitKey(1) if __name__ == "__main__": main() 给以上代码进行解析讲解,并告诉我代码的亮点和难点
这段代码实现了使用 Mediapipe 库进行人脸检测,并在检测到人脸时在人脸周围绘制矩形框和关键点,并显示帧率。以下是代码的解析讲解:
1. 导入需要的库:
```python
import cv2
import mediapipe as mp
import time
```
2. 创建人脸检测器的类 FaceDetector,并初始化类中的参数:
```python
class FaceDetector():
def __init__(self, minDetectionCon=0.5):
self.minDetectionCon = minDetectionCon
self.mpFaceDetection = mp.solutions.face_detection
self.mpDraw = mp.solutions.drawing_utils
self.faceDetection = self.mpFaceDetection.FaceDetection(self.minDetectionCon)
```
其中,minDetectionCon 表示人脸检测的置信度阈值,mpFaceDetection 和 mpDraw 是 Mediapipe 库中的人脸检测和绘图工具类,faceDetection 是人脸检测器对象。
3. 在 findFaces 方法中,调用人脸检测器对象的 process 方法进行人脸检测,并将检测结果中的人脸位置信息和置信度提取出来:
```python
def findFaces(self, img, draw=True):
imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
self.results = self.faceDetection.process(imgRGB)
bboxs = []
if self.results.detections:
for id, detection in enumerate(self.results.detections):
bboxC = detection.location_data.relative_bounding_box
ih, iw, ic = img.shape
bbox = int(bboxC.xmin * iw), int(bboxC.ymin * ih), \
int(bboxC.width * iw), int(bboxC.height * ih)
bboxs.append([id, bbox, detection.score])
```
其中,bbox 表示人脸的矩形框的左上角坐标和宽高,bboxs 是一个列表,存储每个检测到的人脸的信息,包括人脸 ID、矩形框和置信度。
4. 在 fancyDraw 方法中,根据人脸位置信息和关键点绘制矩形框和关键点:
```python
def fancyDraw(self, img, bbox, l=30, t=5, rt= 1):
x, y, w, h = bbox
x1, y1 = x + w, y + h
cv2.rectangle(img, bbox, (255, 0, 255), rt)
# Top Left x,y
cv2.line(img, (x, y), (x + l, y), (255, 0, 255), t)
cv2.line(img, (x, y), (x, y+l), (255, 0, 255), t)
# Top Right x1,y
cv2.line(img, (x1, y), (x1 - l, y), (255, 0, 255), t)
cv2.line(img, (x1, y), (x1, y+l), (255, 0, 255), t)
# Bottom Left x,y1
cv2.line(img, (x, y1), (x + l, y1), (255, 0, 255), t)
cv2.line(img, (x, y1), (x, y1 - l), (255, 0, 255), t)
# Bottom Right x1,y1
cv2.line(img, (x1, y1), (x1 - l, y1), (255, 0, 255), t)
cv2.line(img, (x1, y1), (x1, y1 - l), (255, 0, 255), t)
return img
```
5. 在 main 函数中,读取视频流,并调用人脸检测器的 findFaces 方法进行人脸检测和绘制:
```python
def main():
cap = cv2.VideoCapture("Videos/6.mp4")
pTime = 0
detector = FaceDetector()
while True:
success, img = cap.read()
img, bboxs = detector.findFaces(img)
print(bboxs)
cTime = time.time()
fps = 1 / (cTime - pTime)
pTime = cTime
cv2.putText(img, f'FPS: {int(fps)}', (20, 70), cv2.FONT_HERSHEY_PLAIN, 3, (0, 255, 0), 2)
cv2.imshow("Image", img)
cv2.waitKey(1)
```
6. 代码亮点:
- 使用 Mediapipe 库中的人脸检测器和绘图工具类,简化了人脸检测和绘制的实现过程;
- 在 fancyDraw 方法中,根据人脸位置信息和关键点绘制矩形框和关键点,使得人脸检测结果更加直观。
7. 代码难点:
- 对于初学者来说,理解 Mediapipe 库中的人脸检测器和绘图工具类的使用方法可能比较困难;
- 在 fancyDraw 方法中,需要根据人脸位置信息和关键点计算出矩形框的位置和大小,并绘制出矩形框和关键点,需要一定的数学基础和编程经验。
能给我讲解cv2.putText
cv2.putText()是OpenCV中用于在图像上绘制文本的函数。它的语法如下:
cv2.putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])
其中,参数含义如下:
- img:要绘制文本的图像;
- text:要绘制的文本;
- org:文本的起始坐标点;
- fontFace:字体类型;
- fontScale:字体大小比例因子;
- color:文本颜色;
- thickness:线条粗细程度,默认值为1;
- lineType:线条类型,默认值为cv2.LINE_AA;
- bottomLeftOrigin:如果为true的话,坐标原点就是在图像左下角;否则,坐标原点就是在图像左上角。
例如,要在图像上绘制文本 "Hello, World!",可以使用以下代码:
```python
import cv2
img = cv2.imread('image.jpg')
font = cv2.FONT_HERSHEY_SIMPLEX
org = (50, 50)
fontScale = 1
color = (255, 0, 0)
thickness = 2
lineType = cv2.LINE_AA
cv2.putText(img, 'Hello, World!', org, font, fontScale, color, thickness, lineType)
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
这里,我们使用了cv2.imread()函数读取了一张图像,然后使用cv2.putText()函数在图像上绘制了 "Hello, World!" 文本,并使用cv2.imshow()函数显示了结果。
阅读全文