c++ - 将 opencv 重映射代码从 c++ 转换为 python
问题描述
我正在尝试将 c++ opencv cv2.remap 代码转换为 python。我没有收到任何错误,但结果与预期不符。我正在放大图像
c++代码
int main()
{
Mat img = imread("captcha1.jpg");
float phase = -0.8 * CV_PI;
float omega = 2.0 * CV_PI / img.cols;
float amp = 15;
Mat_<Vec2f> proj(img.size());
for (int y=0; y<img.rows; y++) {
for (int x=0; x<img.cols; x++) {
float u = 0;
float v = sin(phase + float(x) * omega) * amp;
proj(y,x) = Vec2f(float(x) + u, float(y) + v);
}
}
Mat corr;
cv::remap(img, corr, proj, cv::Mat(), INTER_LINEAR);
imshow("in",img);
imshow("out",corr);
waitKey();
}
蟒蛇代码:
from __future__ import print_function
import cv2
import numpy as np
from past.builtins import xrange
def update():
for j in xrange(rows):
for i in xrange(cols):
phase = -0.8 * np.pi
omega = 2.0 * np.pi / cols
amp = 15
u = -100
v = np.sin(phase + float(i) * omega) * amp
value_xy = (float(i) + u) + (float(j) + v)
map_x.itemset((j, i), value_xy)
map_y.itemset((j, i), 0)
img = cv2.imread('test.jpg')
map_x = np.zeros(img.size, np.float32)
map_y = np.zeros(img.shape[:2], np.float32)
rows, cols = img.shape[:2]
update()
dst = cv2.remap(img, map_x, map_y, cv2.INTER_LINEAR)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
原图:
C++ 结果:
蟒蛇结果:
解决方案
这是我的结果:
一般来说,我更喜欢 Python 中的the vectorized implementation
to the for-loop implementation
。这是我的代码:
#!/usr/bin/python3
# 2018.09.23 12:24 (CST)
import cv2
import numpy as np
fname = "remap.jpg"
img = cv2.imread(fname)
nh, nw = img.shape[:2]
PI = 3.141592653589793
phase = -0.8 * PI
omega = 2.0 * PI / nw
amp = 15
xs, ys = np.meshgrid(np.arange(0, nw), np.arange(0, nh))
ys = np.sin(phase+xs*omega)*amp + ys
xs = np.float32(xs)
ys = np.float32(ys)
dst= cv2.remap(img, xs, ys, cv2.INTER_CUBIC)
cv2.imwrite("dst.png", dst)
推荐阅读
- json - 我们如何在 Botium Box 中设置代理,在“通用 HTTP(s)/JSON 连接器”中
- python - 井字游戏没有学会取胜
- github - .gitignore 不忽略目录中的文件夹
- kubernetes - 政策 pod 在驱逐时开始
- email - 如何从 .ost 文件恢复已发送的邮件?
- java - Mono/Flux 是否有来自 Stream / Optional API 的 Peek / IfPresent 等运算符?
- c - 相同的 HTTP 请求使用 CURL_CLI 传递,但使用 LIBCURL 失败
- postgresql - 结果集已关闭错误,带有 jdbc 和 postgresql
- python - 为什么 Process 对象的属性在运行后不保留?
- java - 无法在 JPA 中设置默认列值