【发布时间】:2018-09-22 21:17:49
【问题描述】:
我正在尝试将 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();
}
python 代码:
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 结果:
【问题讨论】:
-
为什么在 C++ 中使用
u = 0而在 Python 中使用u = -100?为什么不将rows, cols作为参数传递给update,而不是依赖全局变量呢?恕我直言map_y可以是None。 -
我也不明白为什么你在完全没有理由的情况下通过更改变量名称和代码结构来让你的生活变得更加艰难。我的意思是,看看this——与原始 C++ 实现并排比较不是更容易吗?
-
一旦你有了它,你就可以尝试优化。例如摆脱那些嵌套的
for循环,并用矢量化numpy操作替换它们。说,like this -
@DanMašek :感谢您的帮助,对此感到困惑 # NB: Mat_
-> 2 个通道 proj = np.zeros((img.shape[0], img.shape[1] , 2), np.float32)
标签: c++ python-3.x opencv opencv3.0 remap