Python 对视频帧进行逐像素操作时,处理帧会花费太多时间
我已经做了几乎所有我能做的,但我仍然不能再爱这个了。任何有想法的人请帮我写一些代码。当我把打印放在for循环外时,它工作得很好。但是我没有得到图像中每个像素的值。与代码的其余部分相比,打印速度不可避免地慢。假设图像为256x256,代码将打印65536个值。根据我对OpenCV不熟悉的格式,让我们假设每像素1字节,即每像素2到4字节的输出,将8位无符号字节转换为文本+行尾,因此128kB-320kB,您的终端需要滚动Python 对视频帧进行逐像素操作时,处理帧会花费太多时间,python,image-processing,pixel,opencv3.0,Python,Image Processing,Pixel,Opencv3.0,我已经做了几乎所有我能做的,但我仍然不能再爱这个了。任何有想法的人请帮我写一些代码。当我把打印放在for循环外时,它工作得很好。但是我没有得到图像中每个像素的值。与代码的其余部分相比,打印速度不可避免地慢。假设图像为256x256,代码将打印65536个值。根据我对OpenCV不熟悉的格式,让我们假设每像素1字节,即每像素2到4字节的输出,将8位无符号字节转换为文本+行尾,因此128kB-320kB,您的终端需要滚动 最好的办法是限制您尝试打印的像素区域:即,使用适当的参数为范围调用指定一个适当
最好的办法是限制您尝试打印的像素区域:即,使用适当的参数为范围调用指定一个适当的小区域。与代码的其余部分相比,打印不可避免地慢。假设图像为256x256,代码将打印65536个值。根据我对OpenCV不熟悉的格式,让我们假设每像素1字节,即每像素2到4字节的输出,将8位无符号字节转换为文本+行尾,因此128kB-320kB,您的终端需要滚动
最好的办法是限制您尝试打印的像素区域:即,在范围调用中使用适当的参数指定一个适当的小区域。您确实应该避免在Python中对图像执行for循环和逐像素操作。尝试使用OpenCV矢量化例程,如cv2.threshold,否则使用矢量化Numpy例程 您在评论中提到要这样做:
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
def threshold_slow(image):
h = image.shape[0]
w = image.shape[1]
for x in range(0, w):
for y in range(0, h):
k = np.array(image[x, y])
print(k)
def video():
while True:
ret,frame = cap.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
threshold_slow(frame)
cv2.imshow('frame',frame)
key = cv2.waitKey(25)
if key == ord('q'):
break
if __name__ == '__main__':
video()
cap.release()
cv2.destroyAllWindows()
然后,您可以通过以下方式将其应用于您的图像:
mask = cv2.inRange(im, 140, 160)
但我认为这样做比较慢。在Python中,您确实应该避免for循环和逐像素操作。尝试使用OpenCV矢量化例程,如cv2.threshold,否则使用矢量化Numpy例程 您在评论中提到要这样做:
import cv2
import numpy as np
cap = cv2.VideoCapture(0)
def threshold_slow(image):
h = image.shape[0]
w = image.shape[1]
for x in range(0, w):
for y in range(0, h):
k = np.array(image[x, y])
print(k)
def video():
while True:
ret,frame = cap.read()
frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
threshold_slow(frame)
cv2.imshow('frame',frame)
key = cv2.waitKey(25)
if key == ord('q'):
break
if __name__ == '__main__':
video()
cap.release()
cv2.destroyAllWindows()
然后,您可以通过以下方式将其应用于您的图像:
mask = cv2.inRange(im, 140, 160)
但是我认为这样做比较慢。如果for循环中逐像素的操作太慢,不要这样做!使用cv2.Threshold如果我有这样的情况,那又怎样;k=图像[y,x]如果140
mask = cv2.inRange(im, 140, 160)
frame[~mask] = 255