照度差ステレオ法のサンプルソースコード

Tweet


照度差ステレオ法のサンプルプログラムです.カメラと物体を固定し,暗室で無限遠点光源1つを照射し,光源方向を変えて3枚撮影したモノクロ画像が入力データです.光源方向は既知とし,ソースコード中の変数matlに光源方向をあらかじめ記入しておいてください.Google Colabを開いて新規作成し,以下のソースコードのテキスト情報をコピペしてください.実行したら,ファイルアップロードのボタンが出てくるので,ボタンを押してアップロードしたい画像ファイル3枚を指定してください.計算結果の法線がダウンロードされます.各画素に3次元ベクトルが格納されたnumpyファイルとして出力されます.

input0.bmp
input1.bmp
input2.bmp
inside.bmp

from google.colab import files
import numpy as np
import cv2

files.upload()
input=[]
input.append(cv2.imread('input0.bmp',cv2.IMREAD_GRAYSCALE))
input.append(cv2.imread('input1.bmp',cv2.IMREAD_GRAYSCALE))
input.append(cv2.imread('input2.bmp',cv2.IMREAD_GRAYSCALE))
rows,cols=input[0].shape
matl=np.zeros((3,3),dtype=np.float64)
matl[0,0]=1.58546E-17
matl[0,1]=0.258819045
matl[0,2]=0.965925826
matl[1,0]=-0.353553391
matl[1,1]=-0.353553391
matl[1,2]=0.866025404
matl[2,0]=0.353553391
matl[2,1]=-0.353553391
matl[2,2]=0.866025404
invl=np.linalg.inv(matl)
output=np.zeros((rows,cols,3),dtype=np.float32)
for y in range(0,rows):
  for x in range(0,cols):
    veci=np.zeros((3,1),dtype=np.float64)
    veci[0,0]=input[0][y,x]
    veci[1,0]=input[1][y,x]
    veci[2,0]=input[2][y,x]
    vecn=invl@veci
    r=np.linalg.norm(vecn)
    if r>1e-15:
      vecn/=r
    output[y,x,0]=vecn[0,0]
    output[y,x,1]=vecn[1,0]
    output[y,x,2]=vecn[2,0]
np.save('normal.npy',output)
files.download('normal.npy')


もどる