python - 当我尝试将单个像素绘制到屏幕上以获得图像时,为什么 pygame 会崩溃

标签 python image opencv pygame

我一直在编写一段代码,它比较两个图像并告诉我它们是否相似,它还告诉我图像中哪些像素不同,之后它将它们绘制到 pygame 屏幕中,以便我可以查看图像的哪些部分移动得更清晰。唯一的问题是 pygame 似乎无法处理它或其他东西并且崩溃,但没有出现错误。

代码:

import cv2
import pygame
from pygame.locals import *

lib = 'Map1.png'
lib2 = 'Map2.png'
lib3 = []
coordenatesx = []
coordenatesy = []

Read = list(cv2.imread(lib).astype("int"))
Read2 = list(cv2.imread(lib2).astype("int"))

counter = 0

for i in range(len(Read)):#y coords
    for j in range(len(Read[i])):#x coords
        blue = list(Read[i][j])[0]
        green = list(Read[i][j])[1]
        red = list(Read[i][j])[2]
        blue2 = list(Read2[i][j])[0]
        green2 = list(Read2[i][j])[1]
        red2 = list(Read2[i][j])[2]
        difference = (blue+green+red)-(blue2+green2+red2)
        lib3.append(difference)
        if difference <= 10 and difference >= -10:
            counter+=1
            coordenatesx.append(j)
            coordenatesy.append(i)


if counter >= (i*j)*0.75:
    print('They are similar images')
    print('They are different by:', str((counter / (i * j)) * 100), '%')
else:
    print('They are different')
    print('They are different by:', str((counter / (i * j)) * 100), '%')

pygame.init()

screen = pygame.display.set_mode((500,500))

while 1:
    screen.fill((20))
    for event in pygame.event.get():
        if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
            pygame.quit()
    for l in range(len(coordenatesx)):
        for v in range(len(coordenatesy)):
            pygame.draw.rect(screen, (blue, red, green), pygame.Rect(coordenatesx[l], coordenatesy[v], 1, 1))
    pygame.display.update()

图像1:

enter image description here

图像2:

enter image description here

最佳答案

Pygame 没有崩溃。您知道在不调用 pygame.event.get() 方法的情况下定义 Pygame 窗口会导致问题吗?好吧,当你把

    for l in range(len(coordenatesx)):
        for v in range(len(coordenatesy)):
            pygame.draw.rect(screen, (blue, red, green), pygame.Rect(coordenatesx[l], coordenatesy[v], 1, 1))

进入应该不断调用pygame.event.get()方法的while循环,你会大大减慢循环过程。

要亲眼看到这一点,请在循环中添加一个 print() 语句,然后看看它的打印速度有多慢:

while 1:
    screen.fill((20))
    print("Looping...")
    for event in pygame.event.get():
        if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
            pygame.quit()
    for l in range(len(coordenatesx)):
        for v in range(len(coordenatesy)):
            pygame.draw.rect(screen, (blue, red, green), pygame.Rect(coordenatesx[l], coordenatesy[v], 1, 1))
    pygame.display.update()

一个修复方法是将 pygame.event.get() 调用移至嵌套的 for 循环(以及如果您想查看更新,则调用 pygame.display.update() ):

while 1:
    screen.fill((20))
    for l in range(len(coordenatesx)):
        for v in range(len(coordenatesy)):
            for event in pygame.event.get():
                if event.type == QUIT or (event.type == KEYDOWN and event.key == K_ESCAPE):
                    pygame.quit()
            pygame.draw.rect(screen, (blue, red, green), pygame.Rect(coordenatesx[l], coordenatesy[v], 1, 1))
            pygame.display.update()

关于python - 当我尝试将单个像素绘制到屏幕上以获得图像时,为什么 pygame 会崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71450944/

相关文章:

Java和OpenCV颜色检测

opencv - 使用立体声SGBM的非常差的视差图

c# - 如何将 2-2-2-2 格式的原始二进制图像转换为 C# 中的位图?

php - 我网站上的图片越来越大

OpenCV:Flann 匹配器崩溃

python - 如何从 QComboBox 中的选项列表设置默认任务?

php - 保存从函数 imagecopy 创建的图像

python - 在 python 中使用 bson.json_util.loads 时如何忽略时区?

python - 无法在python数据框中将列类型从对象转换为str

python - 我如何在 PyQt5 中销毁并重新创建我的窗口?