この質問はこの質問に関連しています: How to remove convexity defects in sudoku square
私は実装しようとしていました nikie's answer
in Mathematica to OpenCV-Python
。しかし、私は手順の最終段階で立ち往生しています。
つまり、次のようにすべての交点を正方形で取得しました。
今、私はこれを以下に示すようにサイズの完全な正方形(450,450)に変換したいと思います:
(2つの画像の明るさの違いを気にしないでください)。
質問:OpenCV-Pythonでこれを行うにはどうすればよいですか?私は使っている cv2
バージョン。
Etarionの提案とは別に、 remap 関数を使用することもできます。これを行う方法を示す簡単なスクリプトを作成しました。ご覧のとおり、これはPythonでは非常に簡単です。これはテストイメージです:
これはワープ後の結果です:
そしてここにコードがあります:
import cv2
from scipy.interpolate import griddata
import numpy as np
grid_x, grid_y = np.mgrid[0:149:150j, 0:149:150j]
destination = np.array([[0,0], [0,49], [0,99], [0,149],
[49,0],[49,49],[49,99],[49,149],
[99,0],[99,49],[99,99],[99,149],
[149,0],[149,49],[149,99],[149,149]])
source = np.array([[22,22], [24,68], [26,116], [25,162],
[64,19],[65,64],[65,114],[64,159],
[107,16],[108,62],[108,111],[107,157],
[151,11],[151,58],[151,107],[151,156]])
grid_z = griddata(destination, source, (grid_x, grid_y), method='cubic')
map_x = np.append([], [ar[:,1] for ar in grid_z]).reshape(150,150)
map_y = np.append([], [ar[:,0] for ar in grid_z]).reshape(150,150)
map_x_32 = map_x.astype('float32')
map_y_32 = map_y.astype('float32')
orig = cv2.imread("tmp.png")
warped = cv2.remap(orig, map_x_32, map_y_32, cv2.INTER_CUBIC)
cv2.imwrite("warped.png", warped)
私はあなたがグーグルでgriddataが何をするかを見つけることができると思います。要するに、それは補間を行い、cv2.remapは密なマッピングを必要とするため、ここではそれを使用して疎なマッピングを密なマッピングに変換します。 OpenCVがfloat64型について文句を言うので、値をfloat32に変換する必要があります。どうなるか教えてください。
Update:Scipyに依存したくない場合、1つの方法は、コードに2d補間関数を実装することです。たとえば、ソースを参照してください。 Scipyのgriddataのコードまたはこのような単純なコード http://inasafe.readthedocs.org/en/latest/_modules/engine/interpolation2d.html これはnumpyのみに依存します。ただし、これにはScipyまたは別のライブラリを使用することをお勧めしますが、このような場合には、CV2とnumpyのみが必要な理由がわかります。最終的なコードが数独をどのように解決するかを聞きたいです。
ソースポイントとエンドポイントがある場合(必要なのは4つだけ)、それらをcv2.getPerspectiveTransformにプラグインし、その結果をcv2.warpPerspectiveで使用できます。あなたに素晴らしいフラットな結果を与えます。