

PythonのOpenCVで画像のゆがみ補正を行いたいのですが、下記のようなコードで撮影したチェスボードから  
ゆがみ係数を求めるというのはわかったのですが、Webサービスなどでユーザーのアップロードした画像のゆがみを補正する場合など（画像サイズも不規則）はこの係数はどう求めたらいいのでしょうか？

findChessboardCornersやfindCirclesGridを使用しないでゆがみを補正する方法があればご教授頂ければと思います。

[code]

       # -*- coding: utf-8 -*-
        import numpy as np
        import cv2
        import glob
    
        fileName = "chess.jpg"
        imagePath = "./" + fileName
    
        image = cv2.imread(imagePath)
        grayImage = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
        ChessboardPatternSize = (9, 7)
    
        height, width = image.shape[:2]
    
        objPoints = [] # 3d point
        imgPoints = [] # 2d points 
    
        # termination criteria
        criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 0, 0.1)
    
        objp = np.zeros( (np.prod(ChessboardPatternSize), 3), np.float32 )
        objp[:,:2] = np.indices(ChessboardPatternSize).T.reshape(-1, 2)
        objp *= 1
    
        ret, corners = cv2.findChessboardCorners(grayImage, ChessboardPatternSize)
    
        if ret == True:
    
          corners2 = cv2.cornerSubPix(grayImage, corners, (11, 11), (-1,-1), criteria)
    
          objPoints.append(objp)
          imgPoints.append(corners.reshape(-1, 2))
    
          print objPoints
          print imgPoints
          np.save('objPoints.npy', objPoints)
          np.save('imgPoints.npy', imgPoints)
    
[/code]


CC BY-SA 3.0
2016-03-01T07:01:02.840
22688
2016-03-03T08:54:21.707
11167
question
python opencv
pythonのOpenCVで画像歪み補正


> findChessboardCornersやfindCirclesGridを使用しないでゆがみを補正する方法があれば  
>  スマートフォンに広角レンズを着用しアップロードされた画像の歪みを補正したいです。

実現不可能です。未知の「ゆがみ」をキャリブレーションなしに画像補正することは出来ません。

与えられた前提条件だけでは「ゆがみ」をモデル化することができず、復元したいオリジナルの映像、すなわち逆変換を定義できません。チェッカーボード等を用いたキャリブレーションでは、撮像系のゆがみモデル定式化を仮定し、そのモデルのパラメータを逆推定することで補正を行っています。そのような補助データなしに本来の映像を復元することは（人間の"勘"をのぞけば）実現不可能です。

* * *

ちょっとだけ補足：スマートフォンに取り付ける広角レンズの光学特性と、マウンタなどで取り付け位置を固定させることができるならば、事前キャリブレーションしたパラメータを記録しておき、全ての映像を同パラメータで補正するという手段が取れます。（カメラ・レンズのメーカはこれ相当のことをやっているはずです）


CC BY-SA 3.0
2016-03-02T14:42:27.283
22740
2016-03-03T08:54:21.707
2016-03-03T08:54:21.707
49
49
22688
answer