Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 对视频帧进行逐像素操作时,处理帧会花费太多时间_Python_Image Processing_Pixel_Opencv3.0 - Fatal编程技术网

Python 对视频帧进行逐像素操作时,处理帧会花费太多时间

Python 对视频帧进行逐像素操作时,处理帧会花费太多时间,python,image-processing,pixel,opencv3.0,Python,Image Processing,Pixel,Opencv3.0,我已经做了几乎所有我能做的,但我仍然不能再爱这个了。任何有想法的人请帮我写一些代码。当我把打印放在for循环外时,它工作得很好。但是我没有得到图像中每个像素的值。与代码的其余部分相比,打印速度不可避免地慢。假设图像为256x256,代码将打印65536个值。根据我对OpenCV不熟悉的格式,让我们假设每像素1字节,即每像素2到4字节的输出,将8位无符号字节转换为文本+行尾,因此128kB-320kB,您的终端需要滚动 最好的办法是限制您尝试打印的像素区域:即,使用适当的参数为范围调用指定一个适当

我已经做了几乎所有我能做的,但我仍然不能再爱这个了。任何有想法的人请帮我写一些代码。当我把打印放在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]如果140mask = cv2.inRange(im, 140, 160)
frame[~mask] = 255