読者です 読者をやめる 読者になる 読者になる

粗大メモ置き場

個人用,たまーに来訪者を意識する雑記メモ

Raspberry Pi3 に OpenCV3をインストール(Raspbian Jessie環境上)&キャリブレーション

前回UbuntuOpenCV入れて遊んだので今度はRaspberryPiに入れてみます。

前回の記事↓
ossyaritoori.hatenablog.com

正直同じような手順な上,完全に以下のサイトの通りやったので特に言うことはありません。

Install guide: Raspberry Pi 3 + Raspbian Jessie + OpenCV 3 - PyImageSearch

以下個人用のメモを残すのみとさせていただきます。

cmake後

手持ちの環境ではPython3にnumpyとOpenCV3が紐付けられた。

OpenCV make 時

非常に熱くなるので適宜冷やしながら行った。途中でフリーズした。

それ以後

現在検証中~~

キャリブレーション

python2系で書いてますけど実際は3の環境でやるので
printまわりは直しておかないと行けないですね。

rmsエラーが自分は0.3程度になりましたがいくつくらいになるといいのかの感覚などはいまだ無いです。

# -*- coding: utf-8 -*-
# largely from here
# http://russeng.hatenablog.jp/entry/2015/06/16/004704

import numpy
import cv2
# get file name efficiently
from glob import glob 

def main():
 
    square_size = 1.0      # 正方形のサイズ
    pattern_size = (10, 7)  # 模様のサイズ
    pattern_points = numpy.zeros( (numpy.prod(pattern_size), 3), numpy.float32 ) #チェスボード(X,Y,Z)座標の指定 (Z=0)
    pattern_points[:,:2] = numpy.indices(pattern_size).T.reshape(-1, 2)
    pattern_points *= square_size
    obj_points = []
    img_points = []
 
    for fn in glob("images/*.jpg"):
        # 画像の取得
        im = cv2.imread(fn, 0)
        print "loading..." + fn
        # チェスボードのコーナーを検出
        found, corner = cv2.findChessboardCorners(im, pattern_size)
        # コーナーがあれば
        if found:
            term = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 30, 0.1)
            cv2.cornerSubPix(im, corner, (5,5), (-1,-1), term)
        # コーナーがない場合のエラー処理
        if not found:
            print 'chessboard not found'
            continue
        img_points.append(corner.reshape(-1, 2))   #appendメソッド:リストの最後に因数のオブジェクトを追加
        obj_points.append(pattern_points)
        #corner.reshape(-1, 2) : 検出したコーナーの画像内座標値(x, y)
 
    # 内部パラメータを計算 rms,CameraMatrix,Distorition,rotate vec,translate vec
    rms, K, d, r, t = cv2.calibrateCamera(obj_points,img_points,(im.shape[1],im.shape[0]),None,None)
    # 計算結果を表示
    print "RMS = ", rms
    print "K = \n", K
    print "d = ", d.ravel()
    # 計算結果を保存
    numpy.savetxt("rms.csv", numpy.array([rms]), delimiter =',',fmt="%0.14f")
    numpy.savetxt("K.csv", K, delimiter =',',fmt="%0.14f")
    numpy.savetxt("Dist.csv", d, delimiter =',',fmt="%0.14f")
 
if __name__ == '__main__':
    main()

地味にnumpysavetxtでスカラー値を保存できない問題

numpy.savetxt で“tuple index out of range”?
などと出る場合、arrayではなく単一の数として認識しているためエラーになります。

numpy.array([rms]) として1行1列の行列として扱ってやることで解決しました。意外とむずい。