目录
Python
opencv中cv2.waitKey(1) & 0xFF的作用
import cv2
import datetime, os
savePath = "E:/Image/"
if not os.path.exists(savePath):
os.makedirs(savePath)
cap = cv2.VideoCapture(0)
capture = False
if not cap.isOpened():
print("无法打开摄像头")
exit()
while True:
ret, frame = cap.read()
if not ret:
print("无法接收帧 (stream end?). Exiting ...")
break
cv2.imshow('Image', frame)
current_time = datetime.datetime.now().strftime("%Y%m%d_%H%M%S_%f")
if capture:
cv2.imwrite(os.path.join(savePath, current_time + ".jpg"), frame)
key = cv2.waitKey(1) & 0xFF
# 按下'q'键退出循环
if key == ord('q'):
break
elif key == ord('s'):
print("开始抓取图片")
capture = True
cap.release()
cv2.destroyAllWindows()
cv2.waitKey(1) & 0xFF
的作用是:
cv2.waitKey(1)
:等待1毫秒,检查是否有键盘输入。如果有输入,则返回按键的ASCII
码值;如果没有输入,则返回-1。& 0xFF
:通过按位与操作,将返回值的高位清零,只保留低8位。这是因为在某些系统上,cv2.waitKey
可能返回一个大于8位的整数,而我们只关心低8位的ASCII
码值。
这样做的目的是确保代码在不同平台上都能正确处理键盘输入。例如,在Windows和Linux系统上,cv2.waitKey
的返回值可能有所不同,通过& 0xFF
可以统一处理这些差异。
cv2.imshow和plt.imshow的区别
同样一张灰度图,plt.imshow
显示的图片和cv2.imshow
显示的图片不一致,这是因为cv2.imshow
和plt.imshow
在处理图像显示时的默认行为有所不同。
# matplotlib绘制
plt.imshow(image, "gray")
plt.show()
# cv2绘制
cv2.imshow("img", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
从下面图看matplotlib
绘制的要比cv2
绘制的对比度更强、更亮
![]() | ![]() |
---|---|
matplotlib绘制 | cv2绘制 |
- cv2.imshow和plt.imshow的区别:
1. 颜色空间:
cv2.imshow
使用的是 BGR 颜色空间,而plt.imshow
使用的是 RGB 颜色空间。如果在使用plt.imshow
时没有指定颜色空间,它会假设输入图像是 RGB 的。- 对于灰度图像,这个差异不明显,但在彩色图像中会导致颜色显示不正确。
2. 图像归一化:
-
plt.imshow
在显示灰度图像时,会自动对图像进行归一化处理,即将图像的像素值缩放到 [0, 1] 范围内。 -
cv2.imshow
则不会进行这种归一化处理,它直接显示图像的原始像素值。
3. 显示范围:
-
plt.imshow
默认会将灰度图像的像素值映射到 [0, 1] 范围内,这样可以增强对比度,使得图像看起来更亮。 -
cv2.imshow
则直接使用图像的原始像素值进行显示,如果图像的像素值范围较小,显示出来的图像可能会显得较暗。
为了让两者显示效果一致,可以在使用plt.imshow
时关闭自动归一化功能,或者手动对图像进行归一化处理后拉伸到0-255再使用cv2.imshow
进行图像显示。例如:
import cv2
import matplotlib.pyplot as plt
# 假设 image是灰度图像
# 拉升像素值到0-255
min_val = np.min(image)
max_val = np.max(image)
stretched_image = 255 * ((tempImg - min_val) / (max_val - min_val))
stretched_image = stretched_image.astype(np.uint8)
# 使用 cv2.imshow 显示
cv2.imshow("img", stretched_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 使用 plt.imshow 显示
plt.imshow(image, cmap='gray', vmin=0, vmax=255)
plt.show()
Jupyter中批量释放当前网页的变量
import sys
import gc
# 获取当前命名空间中的所有变量
variables = {name: value for name, value in globals().items() if not name.startswith('_') and not callable(value)}
# 按照内存大小由大到小排序
sorted_variables = sorted(variables.items(), key=lambda item: sys.getsizeof(item[1]), reverse=True)
# 打印每个变量的内存大小
for name, value in sorted_variables:
print(f"{name}: {sys.getsizeof(value)} bytes")
if sys.getsizeof(value) > 1000:
# 释放变量
del globals()[name]
print(f"{name}:已释放")
# 强制进行垃圾回收
gc.collect()
plt.imshow针对负数部分单独可视化为黄色
在使用 matplotlib 的 plt.imshow() 函数显示图像时,如果你希望将所有负数值统一显示为黄色,可以通过自定义颜色映射(colormap)来实现。具体来说,你可以创建一个颜色映射,并指定负数对应的区域为黄色。
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap
# 假设 img 是你的图像数据
img = np.random.randn(10, 10) # 生成一个随机的 10x10 图像,包含正数和负数
# 创建一个颜色映射
cmap = plt.cm.viridis # 使用默认的 viridis 颜色映射
cmap.set_under('yellow') # 将负数部分设置为黄色
# 显示图像
plt.imshow(img, cmap=cmap, vmin=0) # vmin=0 表示将小于 0 的值视为“under”
plt.colorbar() # 显示颜色条
plt.show()