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。
我的问题是:
- 我是否以错误的方式使用了 cv2.resize() 函数?
- 是否有更好的方法从未失真的相机视图生成 (y, x) 点?
- 如何在朴素算法中将 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
我正在尝试校准高清摄像头,分辨率为 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。
我的问题是:
- 我是否以错误的方式使用了 cv2.resize() 函数?
- 是否有更好的方法从未失真的相机视图生成 (y, x) 点?
- 如何在朴素算法中将 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