I am attempting to combine images after cv2 perspective warping, but I get parts of other images appear. This is NOT CONSISTENT. Sometimes I run the code and everything looks right; other times part of other images appear.
4 images use perspective, but when I add one that has just been resized, parts of other images appear where they are not supposed to. Commenting out creating some images has different parts of other images appearing, and I can run the same program multiple times with different results.
Here is the code, but it does not include the images
import tkinter as tk
from tkinter import *
import PIL
from PIL import Image, ImageTk
PIL.Image.ANTIALIAS = PIL.Image.LANCZOS
import os.path
import numpy as np
import cv2
WHITE="#ffffff"
BLACK="#000000"
BLUE="#0000ff"
DK_GREY="#808080"
LT_GREY="#a0a0a0"
YELLOW="#ffff00"
MED_ORANGE="#ff9933"
RED="#ff0000"
DK_RED="#cc0000"
CANVAS_WIDTH=645
CANVAS_HEIGHT=480
mainWin = tk.Tk(className='Castle game')
mainWin.geometry('700x500')
canvas = tk.Canvas(mainWin, height=CANVAS_HEIGHT, width=CANVAS_WIDTH, bg=BLACK)
canvas.place(x=10,y=10)
castleWall1Path = os.path.abspath(os.path.join('..','images','CastleWall1.png'))
castleWall2Path = os.path.abspath(os.path.join('..','images','CastleWall1-window.png'))
castleFloorPath = os.path.abspath(os.path.join('..','images','CastleFloor.png'))
castleCeilingPath = os.path.abspath(os.path.join('..','images','CastleCeiling1.png'))
castleWallFarPath = os.path.abspath(os.path.join('..','images','CastleWall1-doorClosed.png'))
rtSrcPts = np.float32([(0,0), (640,0), (640, 480), (0, 480)])
rtDstPts = np.float32([(0, 160), (215, 0), (215, 480), (0, 320)])
lftSrcPts = np.float32([(0,0), (640, 0), (640, 480), (0, 480)])
lftDstPts = np.float32([(0,0), (215, 160), (215, 320), (0, 480)])
floorSrcPts = np.float32([(0,0), (640, 0), (640, 480), (0, 480)])
floorDstPts = np.float32([(215, 0), (430, 0), (645, 160), (0, 160)])
ceilSrcPts = np.float32([(0,0), (640, 0), (640, 480), (0, 480)])
ceilDstPts = np.float32([(0,0), (640, 0), (430, 160), (215, 160)])
rtImg = cv2.imread(castleWall1Path, cv2.IMREAD_UNCHANGED)
rtImg = cv2.cvtColor(rtImg, cv2.COLOR_BGRA2RGBA)
lftImg = cv2.imread(castleWall2Path, cv2.IMREAD_UNCHANGED)
lftImg = cv2.cvtColor(lftImg, cv2.COLOR_BGRA2RGBA)
floorImg = cv2.imread(castleFloorPath, cv2.IMREAD_UNCHANGED)
floorImg = cv2.cvtColor(floorImg, cv2.COLOR_BGRA2RGBA)
ceilImg = cv2.imread(castleCeilingPath, cv2.IMREAD_UNCHANGED)
ceilImg = cv2.cvtColor(ceilImg, cv2.COLOR_BGRA2RGBA)
farImg = cv2.imread(castleWallFarPath, cv2.IMREAD_UNCHANGED)
farImg = cv2.cvtColor(farImg, cv2.COLOR_BGRA2RGBA)
farImg = cv2.resize(farImg, (215,160))
xformMatRt = cv2.getPerspectiveTransform(rtSrcPts, rtDstPts)
rtImgPersp = cv2.warpPerspective(rtImg, xformMatRt, (215, 480), borderMode=cv2.BORDER_TRANSPARENT)
rtImgPil = Image.fromarray(rtImgPersp)
rtImgDisp = ImageTk.PhotoImage(rtImgPil)
canvas.create_image(430, 0, image=rtImgDisp, anchor = tk.NW)
xformMatLft = cv2.getPerspectiveTransform(lftSrcPts, lftDstPts)
lftImgPersp = cv2.warpPerspective(lftImg, xformMatLft, (215,480), borderMode=cv2.BORDER_TRANSPARENT)
lftImgPil = Image.fromarray(lftImgPersp)
lftImgDisp = ImageTk.PhotoImage(lftImgPil)
canvas.create_image(0,0, image=lftImgDisp, anchor = tk.NW)
xformMatFloor = cv2.getPerspectiveTransform(floorSrcPts, floorDstPts)
floorImgPersp = cv2.warpPerspective(floorImg, xformMatFloor, (645, 160), borderMode=cv2.BORDER_TRANSPARENT)
floorImgPil = Image.fromarray(floorImgPersp)
floorImgDisp = ImageTk.PhotoImage(floorImgPil)
canvas.create_image(0, 320, image=floorImgDisp, anchor = tk.NW)
xformMatCeil = cv2.getPerspectiveTransform(ceilSrcPts, ceilDstPts);
ceilImgPersp = cv2.warpPerspective(ceilImg, xformMatCeil, (645, 160), borderMode=cv2.BORDER_TRANSPARENT)
ceilImgPil = Image.fromarray(ceilImgPersp)
ceilImgDisp = ImageTk.PhotoImage(ceilImgPil)
canvas.create_image(0, 0, image=ceilImgDisp, anchor = tk.NW)
farImgPil = Image.fromarray(farImg)
farImgDisp = ImageTk.PhotoImage(farImgPil)
canvas.create_image(215, 160, image=farImgDisp, anchor = tk.NW);
mainWin.mainloop()
Sometimes this looks right; other times part if CeilImg or FloorImg show up near the top of the display, with no changes to the code.
Is there something I need to clear to remove a previous image from processing? Or is this just not going to work this way?
Kosh’s Shadow is a new contributor to this site. Take care in asking for clarification, commenting, and answering.
Check out our Code of Conduct.