Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.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中使用pil的两个图像之间的差异?_Python_Python Imaging Library - Fatal编程技术网

我如何看待python中使用pil的两个图像之间的差异?

我如何看待python中使用pil的两个图像之间的差异?,python,python-imaging-library,Python,Python Imaging Library,我正在尝试制作一个程序,从我的macbook相机(或任何相机)上看,让我知道什么时候发生了什么(灯打开/关闭,任何动作等),该程序每1秒拍摄一次屏幕截图,并将最后拍摄的图像与刚刚拍摄的图像进行比较 这是我的while循环中的代码 while True: time.sleep(1) image = capture_image() if last_image == None: last_image = image # compare the tw

我正在尝试制作一个程序,从我的macbook相机(或任何相机)上看,让我知道什么时候发生了什么(灯打开/关闭,任何动作等),该程序每1秒拍摄一次屏幕截图,并将最后拍摄的图像与刚刚拍摄的图像进行比较

这是我的while循环中的代码

while True:
    time.sleep(1)

    image = capture_image()

    if last_image == None:
        last_image = image

    # compare the two images

    print('image', image)
    print('last image', last_image)
    print('')

    last_image = image

这将给你两张图像的差异,但你肯定想增加一些公差,也许可以通过统计测量。我不确定你是否想使用实时图像,也许可以通过捕获图像,然后在一秒钟后独立运行脚本来分离你的关注点。但这取决于您的应用目的

from PIL import Image
import numpy as np

image1Url = "./img1.jpg"
image2Url = "./img2.jpg"
image1  = Image.open(image1Url)
image2  = Image.open(image2Url)

analyze_img1 = np.asarray(image1)
analyze_img2 = np.asarray(image2)

substr_img  = analyze_img1 - analyze_img2

last_image  = Image.fromarray(substr_img)

last_image.show()

你的问题在某种程度上意味着你正处于这个项目的初始阶段,事情有点模糊,所以我只是总结了一些一般性的想法,直到你在这条路上走得更远

  • 考虑移动到OpenCVOpenCV,因为它有大量有用的函数,并且有大量关于堆栈溢出的示例。查找
    cv2.VideoCapture()
    以获取您的相机流,查找
    cv2.imshow()
    cv2.waitKey()
    以显示您的帧。PIL不太适合显示动态变化的图像,如视频,而
    cv2.imshow()
    将为您提供更好的服务。此外,您将发现自己正在将PIL图像转换为Numpy数组以进行处理,因此您最好使用OpenCV并直接使用Numpy数组

  • 如果要检测照明变化,请尝试将图像转换为灰度
    cv2.cvt颜色(…BGR2GRAY…
    ,并使用
    np.mean()取平均值。试着运行你的循环,它看起来是正确的,并且在每次迭代时在终端上打印平均值,同时关闭灯。然后,您可以看到它的变化程度,并计算出一个合理的阈值

  • 至于运动,你可能不是在像素级寻找运动,否则你会检测到风把一片树叶吹出窗外。所以,你需要大规模的改变。因此,如果您的相机是1080p(1920x1080),请尝试使用cv2将图像大小调整为16像素乘以9。调整大小(im,(16,9),…INTER_LINEAR…,然后您只需快速查看和比较144个像素即可。您始终可以将这些图像缩放回300-400的边长
    cv2。调整大小(…最近邻…)
    以显示以前和当前帧。然后查看144个图像矩形中每个矩形之间的颜色距离,看看是否有任何矩形超过测试得出的阈值


  • 试着开发一下你的代码,获得一些经验,然后如果你遇到问题,回来问另一个问题-问题和答案都是免费的。

    这里有一个例子来了解两张图片之间的区别。也许它可以解决你的问题

    from PIL import Image
    from PIL import ImageChops
    img1 = Image.open(yourPath)
    img2 = Image.open(yourPath)
    # make sure img1,img2 have the same picture width and height.
    diff = ImageChops.difference(img1, img2)
    diff.show()
    
    在你的情况下,这可能有效

    from PIL import ImageChops
    While True:
        time.sleep(1)
    
    .......
    
        diff = ImageChops.difference(Now_Image,Last_Image)
        If diff.getbbox() is None:
            print("Now_Image and Last_Image are same.")    
        # diff.show()
        # or you can handle the diff picture.
    
    diff
    图像将显示这些图片之间的差异。
    两张图片之间的差异将显示您,相同的组件将为黑色。

    您的问题是什么?你有具体的问题吗?一般性的“我该怎么做”问题是离题的。
    ?为什么是分号?