python - 我的 OpenCV remap()ing 有什么问题?

标签 python python-3.x opencv image-processing opencv3.0

我把答案里的代码拿走了https://stackoverflow.com/a/10374811/4828720来自 Image transformation in OpenCV并尝试使它适应我的形象。

我的源图像: My source image

在其中,我确定了方格砖中心的像素坐标,如下所示:

Source points

我的目标分辨率是 784。我计算了像素的目标坐标。我得到的代码是这样的:

import cv2
from scipy.interpolate import griddata
import numpy as np

source = np.array([
    [315, 15],
    [962, 18],
    [526, 213],
    [754, 215],
    [516, 434],
    [761, 433],
    [225, 701],
    [1036, 694],
], dtype=int)

destination = np.array([
     [14, 14],
     [770, 14],
     [238, 238],
     [546, 238],
     [238, 546],
     [546, 546],
     [14, 770],
     [770, 770]
], dtype=int)

source_image = cv2.imread('frames.png')

grid_x, grid_y = np.mgrid[0:783:784j, 0:783:784j]
grid_z = griddata(destination, source, (grid_x, grid_y), method='cubic')
map_x = np.append([], [ar[:,1] for ar in grid_z]).reshape(784,784)
map_y = np.append([], [ar[:,0] for ar in grid_z]).reshape(784,784)
map_x_32 = map_x.astype('float32')
map_y_32 = map_y.astype('float32')
warped_image = cv2.remap(source_image, map_x_32, map_y_32, cv2.INTER_CUBIC)
cv2.imwrite("/tmp/warped2.png", warped_image)

如果我运行这个,没有一个源点最终到达它们的预期目的地,但我得到的却是一团扭曲的困惑。我在此处的顶部添加了目的地点:

My result

我哪里错了?我注意到我的网格和 map 数组的分布不如示例中的那样好。是我积分太少了吗?我需要在常规网格中使用它们吗?我尝试只使用外角的四个点,但也没有成功。

最佳答案

整个问题是,我再次对 numpy 的行/列索引而不是 x/y 感到困惑。 #opencv IRC channel 中有人指出了这一点。我的源数组和目标数组必须切换它们的列:

source = np.array([
    [15, 315],
    [18, 962],
    [213, 526],
    [215, 754],
    [434, 516],
    [433, 761],
    [701, 225],
    [694, 1036],
], dtype=int)

destination = np.array([
     [14, 14],
     [14, 770],
     [238, 238],
     [238, 546],
     [546, 238],
     [546, 546],
     [770, 14],
     [770, 770]
], dtype=int)

然后它按预期工作(忽略丑陋的扭曲,这是用于查找错误的简化坐标列表):

enter image description here

关于python - 我的 OpenCV remap()ing 有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37213672/

相关文章:

python - matplotlib slider 重绘不更新图文

python - 分割不可散列类型的字符串

python - 如何使用 discord.py 事件处理程序 on_voice_state_update 仅在用户加入语音 channel 时运行

opencv - 使用深度信息的物体识别算法建议

python - Django 将 opencv 直方图显示到模板中

python - SQL Alchemy 参数化查询,绑定(bind)表名作为参数给出错误

python - 用于外键反向查找的django db_index

python - 带有 Python PIL 的水印 GIF

Python 3.6.3 urlopen 从存储在远程服务器上的 html 文件的 URI 中删除服务器名称

java - 将 InputArrayOfArrays 从 java 类传递到 JNI