前提・実現したいこと
PythonのOpenCVのカメラキャリブレーションについてです。
公式サイトのチュートリアルにあるコードを参考にあらかじめ撮影した動画ファイルのカメラゆがみ補正を行おうとしてます。
補正後の動画サイズを自動で所得し動画の保存をしたいです。
発生している問題・エラーメッセージ
save = cv.VideoWriter('cariburation.MOV',fourcc,frame_rate,(w,h))
のコードを書く場所が分からない。
該当のソースコード
Python
1import numpy as np 2import cv2 as cv 3import glob 4from time import sleep 5from datetime import datetime 6 7 8# termination criteria 9criteria = (cv.TERM_CRITERIA_EPS + cv.TERM_CRITERIA_MAX_ITER, 30, 0.001) 10 11# prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) 12square_size = 21.0 13objp = np.zeros((6*9,3), np.float32) 14objp[:,:2] = np.mgrid[0:6,0:9].T.reshape(-1,2) 15objp *= square_size 16 17# Arrays to store object points and image points from all the images. 18objpoints = [] # 3d point in real world space 19imgpoints = [] # 2d points in image plane. 20images = glob.glob('./img/*.JPG') 21for fname in images: 22 img = cv.imread(fname) 23 gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY) 24 # Find the chess board corners 25 ret, corners = cv.findChessboardCorners(gray, (6,9), None) 26 # If found, add object points, image points (after refining them) 27 if ret == True: 28 objpoints.append(objp) 29 corners2 = cv.cornerSubPix(gray,corners, (11,11), (-1,-1), criteria) 30 imgpoints.append(corners) 31 # Draw and display the corners 32 cv.drawChessboardCorners(img, (6,9), corners2, ret) 33 cv.imshow('img', img) 34 cv.waitKey(500) 35cv.destroyAllWindows() 36 37et, mtx, dist, rvecs, tvecs = cv.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) 38 39 40 41cap = cv.VideoCapture(IMG_7800.MOV) 42 43w = int(cap.get(cv.CAP_PROP_FRAME_WIDTH)) 44h = int(cap.get(cv.CAP_PROP_FRAME_HEIGHT)) 45 46frame_rate = int(cap.get(cv.CAP_PROP_FPS)) 47fourcc = cv.VideoWriter_fourcc('m','p','4','v') 48save = cv.VideoWriter('cariburation.MOV',fourcc,frame_rate,(w,h)) 49 50while cap.isOpened(): 51 ok, frame=cap.read() 52 h, w = img.shape[:2] 53 newcameramtx, roi = cv.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h)) 54 55 # undistort 56 dst = cv.undistort(frame, mtx, dist, None, newcameramtx) 57 # crop the image 58 x, y, w, h = roi 59 dst = dst[y:y+h, x:x+w] 60 save.write(dst) 61 cv.imshow('cariburation', dst) 62 k = cv.waitKey(1) 63 if k == 27 : break # esc pressed
試したこと
save = cv.VideoWriter('cariburation.MOV',fourcc,frame_rate,(w,h))
のw,hに手動で補正後のサイズを入力したら再生できました。これを自動で入力されるようにしたいです。
補足情報(FW/ツールのバージョンなど)
ubuntu20.04を使用
参考にしたサイト
https://docs.opencv.org/4.x/dc/dbb/tutorial_py_calibration.html
回答1件
あなたの回答
tips
プレビュー