Darkside(https対応しました) |
2022年5月29日(日) 21:26
オキュラスの電源が入らなくなった。
正面上の Oculus ロゴのところに白いLEDが点灯しているのに、画面真っ暗。あらゆるボタンが無反応。
さっそく類似症状をネットで調べ、対策を片っ端から試す。その結果、電源ボタンを30秒も長押しするというやり方で復活できた。実際には25秒ぐらいだろうか。長押しは良くあるパターンだが、30秒も押させるのは珍しい。
左右一緒にステッチしてしまうのは、まだバグ残りの可能性がある。そこでここで、片側ずつ処理する版を再掲。以前のものから、少しバグ取りしてある。
import sys
import numpy as np
import cv2
LEFT = 0 # left=1 right=0
videoname = 'bR'
videopath_i = 'e:/' + videoname + '.mov'
videopath_o = 'd:/' + videoname + '/'
dm_w = 4096
dm_h = 4096
dfish = 3684
frame2 = np.zeros((dm_w, dm_h, 3), dtype=np.uint8)
movie = cv2.VideoCapture(videopath_i)
arr_sin_dm_phi = [np.pi] * (dm_w * 2)
arr_cos_dm_phi = [np.pi] * (dm_w * 2)
xmap = np.zeros((dm_h, dm_w), np.float32)
ymap = np.zeros((dm_h, dm_w), np.float32)
try:
# try to load map file
xmap = np.load("xmap.npy")
ymap = np.load("ymap.npy")
except IOError:
# if the map files are not exist, generate new map files.
print("Generating map files...")
for x in range(dm_w * 2):
dm_x = float(x)
dm_phi = np.pi * 2.0 * dm_x / dm_w / 2.0
arr_sin_dm_phi[x] = np.sin(dm_phi)
arr_cos_dm_phi[x] = np.cos(dm_phi)
for y in range(dm_h):
dm_y = float(y)
dm_theta = np.pi * dm_y / (dm_h-1)
sin_dm_theta = np.sin(dm_theta)
cos_dm_theta = np.cos(dm_theta)
xst = int(dm_w / 2)
xen = int(dm_w * 3 / 2)
for x in range(xst,xen):
dm_x = float(x)
sin_dm_phi = arr_sin_dm_phi[x]
cos_dm_phi = arr_cos_dm_phi[x]
tmp2_x = sin_dm_theta * cos_dm_phi
tmp2_y = sin_dm_theta * -sin_dm_phi
tmp2_z = cos_dm_theta
tmp_x = tmp2_x
tmp_y = tmp2_y
tmp_z = tmp2_z
tmp2_x = tmp_x
tmp2_y = tmp_y
tmp2_z = tmp_z
car_x = tmp2_x
car_y = tmp2_y
car_z = tmp2_z
tmp_x = car_x
tmp_y = car_y
tmp_z = car_z
car_x = tmp_z;
car_y = tmp_y;
car_z = -tmp_x;
dm_theta = np.arccos(car_z)
if (car_y > 0):
dm_phi = np.arctan(car_x / car_y)
elif (car_y < 0):
dm_phi = np.pi - np.arctan(car_x / -car_y)
elif (car_y == 0 and car_x > 0):
dm_phi = np.pi / 2.0
elif (car_y == 0 and car_x < 0):
dm_phi = -np.pi / 2.0
else:
dm_phi = 0
xmap[y,x-xst] = (dm_theta / (np.pi) * np.cos(-dm_phi)) * float(dfish) + float(dfish/2)
ymap[y,x-xst] = (dm_theta / (np.pi) * np.sin(-dm_phi)) * float(dfish) + float(dfish/2)
np.save("xmap.npy", xmap)
np.save("ymap.npy", ymap)
LX = 2114
LY = 2023
RX = 1982
RY = 2037
if (LEFT == 1):
CX = LX - dfish / 2
CY = LY - dfish / 2
else:
CX = RX - dfish / 2
CY = RY - dfish / 2
for i in range(len(xmap)):
xmap[i] += CX
for i in range(len(ymap)):
ymap[i] += CY
count = 0
ret, frame = movie.read()
while ret:
frame = cv2.remap(frame, xmap, ymap, cv2.INTER_LINEAR, cv2.BORDER_CONSTANT)
cv2.imwrite(videopath_o + str(100000 + count) + '.png', frame, [int(cv2.IMWRITE_PNG_COMPRESSION), 1]) #3-24
ret, frame = movie.read()
if count % 3600 == 0:
print(int(count/3600), end="")
sys.stdout.flush()
elif count % 60 == 0:
print('.', end="")
sys.stdout.flush()
count += 1
movie.release()
print()
自前ステッチが適切に実行できるようになると、同様に静止画もステッチできるようになる。例によって EOS VR Utility は静止画も jpeg 撮って出しでないとステッチしてくれないので、RAW 撮りしてじっくり絵を追い込み、それをステッチすることができない。自分で現像した結果の tiff や png だって処理してくれよ。
png エンコードは、根本的に重いようだ。他に適切なエンコードも無いから困った。なぜ OpenCV では Cineform 書き出しが出来ないんだ!
ソフトウェア IBIS は移動量推定に使う場所をうまく選べば、性能が向上するのではないかと考えた。しかし、まだまだ手ぶれが消えない。そこで、誤差の累積を防ぐため基準フレームを先頭フレームに固定。移動量が一定を超えたら基準フレームを最新フレームに入れ替えるようにした。
15000フレームぐらいあるクリップで、10フレーム以上ズレて来たら基準フレームを切り替えるようにすると、切り替えは17回に収まった。これで
IBIS 処理をやると、少しマシになった気がするが大差ない気もする。
ならばと3軸(横ズレ・縦ズレ・回転ズレ)ではなく1軸(横ズレ)だけを補正してみた。
すると、何とか鑑賞可能レベルの映像になった。しかし、補正が失敗して手ぶれを拡大してしまう箇所が幾つか残る。少なくとも、合格点は与えられない。
written by higashino [Virtual Reality] [この記事のURL] [コメントを書く] [コメント(0)] [TB(0)]
Generated by MySketch GE 1.4.1
Remodelling origin is MySketch 2.7.4