在Linux下,为什么gui的分辨率和显示结果是反的?

我创建了一个12001920的窗口显示图片,gui的shape也是(1200,1920),但为什么显示出来就是(19201200)的窗口?
还有,怎样在gui中传入分辨率比窗口小的图片?

Hi horizon, 你方便把你认为窗口分辨率有问题的代码贴上来看一下嘛?

import taichi as ti
import numpy as np
import cv2
import time

ti.init(arch=ti.cpu)

beauty = cv2.imread('data/beauty.jpg') # beauty.jpg 是一个(1200,1920)的图片,但是为了正确地在gui中显示我只能先转置再颠倒y轴
beauty = beauty.transpose((1, 0, 2))
beauty = beauty[:, ::-1, :]
beauty = beauty[:, :, ::-1]
w, h, _ = beauty.shape
beauty = beauty.astype(np.float32) / 255

gray = cv2.cvtColor(beauty, cv2.COLOR_BGR2GRAY)

print(w, h)

frame = ti.field(dtype=ti.f32, shape=(w, h))
frame.from_numpy(gray)


converted_beauty = frame.to_numpy()
print(converted_beauty.shape)

# numpy 实现简单的拉普拉斯滤波
st = time.time()
lap_np = np.zeros_like(gray)
lap_np[1:-1, 1:-1] += (gray[:-2, 1:-1]+gray[1:-1, :-2] +
                       gray[1:-1, 2:]+gray[2:, 1:-1])
print(f"numpy use time:{time.time()-st}")

cv2.namedWindow("lap_np", cv2.WINDOW_GUI_NORMAL)
cv2.imshow("lap_np", (lap_np.transpose())[::-1])
cv2.waitKey(0)


@ti.kernel
def ti_lap(gray: ti.types.ndarray(), lap: ti.types.ndarray()):
    H, W = gray.shape[0], gray.shape[1]
    for i, j in ti.ndrange(H, W):
        if 0 < i < H-1 and 0 < j < W-1:
            lap[i, j] = gray[i, j] + \
                (gray[i-1, j]+gray[i, j-1]+gray[i+1, j] + gray[i, j+1])/4

# ti_lap(gray, lap_np)

ti_st = time.time()
lap_ti = np.zeros_like(gray)
ti_lap(gray, lap_ti)
print(f"ti use time: {time.time()-ti_st}")

window = ti.ui.Window('Show love', res=(w//2, h//2), vsync=True)
print(f"window shape:{window.get_window_shape()}")
canvas = window.get_canvas()
while window.running:
    # canvas.rect((0, 0), (height, width), color=0x0)
    canvas.set_image(lap_ti)
    window.show()

我在后面又想了一下,难道在taichi里把矩阵的第一个轴视作宽而不是高?
但是在官方的教程里,又默认ndarray里的第一个轴是height,结果就是显示出来的结果很迷惑。

这个问题和GUI的坐标系有关系,目前你可以对数据做些转换再显示。

好的 多谢 感觉应该在官方文档的教程里说明这一点

1 Like