cv2.resize() 无法与 (y, x) 矩阵一起使用

cv2.resize() unable to use with (y, x) matrix

我正在尝试校准高清摄像头,分辨率为 1280x720。

我需要在对 640x480 大小应用反失真功能后调整它的大小。 所以它将宽高比从 16:9 更改为 4:3.

在我的 opencv 应用程序中,除了保存校准相机的 (y, x) 位置外,任何东西都可以正常工作。我需要它,因为二进制输出文件正在与 flashplayer 应用程序一起使用,该应用程序读取这个更改后的相机 (y, x) 位置并将其应用于 flashplayer 抓取的原始相机视图。

带有 cv2.resize() 的二进制文件:

def generate_grid(rows, cols):
    """Generate grid filed with y,x values at desired size"""
    cc, rr = np.meshgrid(np.arange(cols, dtype=np.uint16), np.arange(rows, dtype=np.uint16))
    return np.dstack([rr, cc])


camera_size = (1280, 720)
binary_size = (320, 240)
raw_grid = generate_grid(camera_size[1], camera_size[0])
undist_grid = cv2.undistort(raw_grid, camera_matrix, dist_coeffs)
resized_grid = cv2.resize(undist_grid, (320, 240))
transformed_grid = cv2.warpPerspective(resized_grid, transformed_matrix, binary_size)

with open(path_to_binary_file, "wb") as binary_file:
    num_bytes_written = binary_file.write(transformed_grid)
    print(transformed_grid.shape)
    print("Wrote %d bytes." % num_bytes_written)

flashplayer 应用程序读取的输出图像:

采用朴素算法的二进制文件:

def generate_grid(rows, cols):
    """Generate grid filed with y,x values at desired size"""
    cc, rr = np.meshgrid(np.arange(cols, dtype=np.uint16), np.arange(rows, dtype=np.uint16))
    return np.dstack([rr, cc])


camera_size = (1280, 720)
binary_size = (320, 240)
raw_grid = generate_grid(camera_size[1], camera_size[0])
undist_grid = cv2.undistort(raw_grid, camera_matrix, dist_coeffs)
resized_grid = generate_grid(480, 640)
_resized_grid = generate_grid(binary_size[1], binary_size[0])

for y in range(undist_grid.shape[0]):
    for x in range(undist_grid.shape[1]):
        if y % 2 != 0 and x % 2 != 0:
            yy = int(y / 2)
            xx = int(x / 2)
            resized_grid[yy, xx, :] = undist_grid[y, x] / 2

        
for y in range(resized_grid.shape[0]):
    for x in range(resized_grid.shape[1]):
        if y % 2 != 0 and x % 2 != 0:
            yy = int(y / 2)
            xx = int(x / 2)
            _resized_grid[yy, xx, :] = resized_grid[y, x] / 2

transformed_grid = cv2.warpPerspective(_resized_grid, transformed_matrix, binary_size)

with open(path_to_binary_file, "wb") as binary_file:
    num_bytes_written = binary_file.write(transformed_grid)
    print(transformed_grid.shape)
    print("Wrote %d bytes." % num_bytes_written)

flashplayer 应用程序读取的输出图像:

所以在天真的情况下,我可以看到从 1280x720 到 640x480 的这种转换是错误的,因为通常它是 640x360。

我的问题是:

  1. 我是否以错误的方式使用了 cv2.resize() 函数?
  2. 是否有更好的方法从未失真的相机视图生成 (y, x) 点?
  3. 如何在朴素算法中将 1280x720 调整为 640x480?

@编辑

我的应用程序运行正常。

我卡在传输中,已将相机数据更改为二进制文件。

我无法使用 cv2.resize()

处理 numpy 二维数组

但最后我可以将 (y, x) 720,1280 数组“缩放”为 480x640

for y in range(undist_grid.shape[0]):
    for x in range(undist_grid.shape[1]):
        if y % 3 != 0 and x % 2 != 0:
            yy = int((2*y) / 3)
            xx = int(x / 2)
            resized_grid[yy, xx, :] = (2 * undist_grid[y, x]) / 3