Flow-Developers

Raspberry Pi, Raspbian, python, ROS, IoT, 電子工作, 機械学習, Deep learning, ライフハック

FFmpegでRGBA-uint16をProRes4444で圧縮すると, DaVinci Resolve上ではfloat32(0.0-1.0[0-65535))の4chで扱える

FFmpegでRGBA-uint16をProRes4444で圧縮すると, DaVinci Resolve上ではfloat32(0.0-1.0[0-65535))の4chで扱える

f:id:flow-dev:20200628152954j:plain

内容

  • DaVinci Resolveで16bitのRGBA(4ch)を扱うためには, FFmpegでRGBA-uint16をProRes4444で圧縮する
  • FFmpegでRGBA-uint16をProRes4444で圧縮することで, DaVinci Resolve上ではfloat32(0.0-1.0[0-65535))の4chで扱える


sample code

  • ProRes4444の仕様は,RGB(12bit),A(最大16bit)ですが,DaVinci Resolveは以下のようにProRes4444を書き込むとDaVinci Resolve上ではfloat32(0.0-1.0[0-65535))の4chで扱えました
#!/usr/bin/env python
# -*- coding:utf-8 -*-

import cv2
import numpy as np
import skvideo.io

if __name__ == '__main__':
    
    images = []

    # test frames(16bit gray png)  
    image_test_01 = cv2.imread("image_test_01.png",0) #16bit_gray_png
    image_test_02 = cv2.imread("image_test_02.png",0) #16bit_gray_png
    image_test_03 = cv2.imread("image_test_03.png",0) #16bit_gray_png

    # append array
    images.append(image_test_01)
    images.append(image_test_02)
    images.append(image_test_03)

    outputfile = "rgba_4ch_uint16.mov"
    
    # ffmpeg prores4444 rgba
        writer = skvideo.io.FFmpegWriter(outputfile, inputdict={}, outputdict={'-r': str(fps), '-codec:v': 'prores_ks', '-pix_fmt': 'rgba', '-profile:v': '4444', '-bits_per_mb': '8000', '-vendor': 'ap10', '-vf': 'scale=in_color_matrix=bt709:out_color_matrix=bt709'})
    
    # 1ch_16bit to 4ch_16bit
    for i in range(len(images)):
            tmp = np.full_like(images[i], 0).astype(np.uint8)
                rgba = cv2.cvtColor(tmp, cv2.COLOR_GRAY2RGBA) #1ch -> 4ch
                rgba = rgba.astype(np.uint16) #uint8 -> uint16
                rgba[:,:,0] = np.full_like(images[i], 65535).astype(np.uint16) # R(uint16)
                rgba[:,:,1] = np.full_like(images[i], 65535).astype(np.uint16) # G(uint16)
                rgba[:,:,2] = np.full_like(images[i], 65535).astype(np.uint16) # B(uint16)
                rgba[:,:,3] = images[i].astype(np.uint16)                      # A(uint16)
                frame = rgba
            writer.writeFrame(frame)
        writer.close()

参考リンク

Encode/VFX – FFmpeg

Video into ProRes

stackoverflow.com

ffmpegでAVC-Intraを作る

flow-developers.hatenablog.com

https://documents.blackmagicdesign.com/SupportNotes/DaVinci_Resolve_15_Supported_Codec_List.pdf

mogrify便利コマンド

mogrify便利コマンド(随時)

  • すぐmogrifyのコマンド忘れてしまうので, 随時更新.

f:id:flow-dev:20200430110527j:plain



画像フォーマットを一括変換
mogrify -format png *tif
画像を一括リサイズ
mogrify -resize 384x216 *.png

参考文献

imagemagick.org

flow-developers.hatenablog.com

【FFmpeg】動画編集用コマンド一覧 [22/02/06更新]

FFmpeg】動画編集用コマンド一覧 [22/02/06更新]

  • WindowsでのProResHQ変換, タイムコード書き込み, RGBAのProRes4444変換をFFmpegで実行しましょう~

f:id:flow-dev:20200430105826j:plain



動画を連番png画像で展開(連番で命名)
ffmpeg -i input.mp4 -vcodec png image_%03d.png
動画に3DLUTを充てて,YUV420で出力
ffmpeg -i input.mp4 -b:v 100M -g 1 -vsync 1 -pix_fmt yuv420p -vcodec libx264 -vf lut3d="3dlut.cube" output.mp4
連番画像を23.98fps,yuv422でh264出力
ffmpeg -r ntsc-film -i %03d.png -y -threads 0 -b:v 100M -minrate 100M -maxrate 100M -bufsize 200M -tune film -color_primaries bt709 -color_trc bt709 -colorspace bt709 -g 1 -vsync 1 -pix_fmt yuv422p -vcodec libx264 -r ntsc-film output.mp4
連番画像を23.98fps,yuv422でh264出力(開始フレーム番号を指定)
ffmpeg -r ntsc-film -start_number 101 -i %03d.png -y -threads 0 -b:v 100M -minrate 100M -maxrate 100M -bufsize 200M -tune film -color_primaries bt709 -color_trc bt709 -colorspace bt709 -g 1 -vsync 1 -pix_fmt yuv422p -vcodec libx264 -r ntsc-film output.mp4
動画を23.98fps,yuv422でProResHQ出力
ffmpeg -r ntsc-film -i input.mp4 -y -threads 0 -codec:v prores_ks -pix_fmt yuv422p10 -profile:v 3 -bits_per_mb 8000 -vendor ap10 -vf scale=in_color_matrix=bt709:out_color_matrix=bt709 -r ntsc-film output.mov
動画を開始タイムコードを指定して,23.98fps,yuv422でProResHQ出力
ffmpeg -r ntsc-film -i input.mp4 -timecode 11:00:06:00 -y -threads 0 -codec:v prores_ks -pix_fmt yuv422p10 -profile:v 3 -bits_per_mb 8000 -vendor ap10 -vf scale=in_color_matrix=bt709:out_color_matrix=bt709 -r ntsc-film output.mov
120p動画を開始タイムコードを指定して,ベース23.98fps, 22fpsスロー H264出力(音声つき)
ffmpeg -r (120*(24/22)) -i input.MP4 -timecode 01:02:03:04 -y -threads 0 -b:v 100M -minrate 100M -maxrate 100M -bufsize 200M -tune film -color_primaries bt709 -color_trc bt709 -colorspace bt709 -g 1 -vsync 1 -pix_fmt yuv420p -vcodec libx264 -r ntsc-film -filter:v "setpts=(22/24)*PTS" -filter:a "atempo=(24/22)" -acodec aac -b:a 256k -ar 48000 -vf lut3d="3dlut.cube" output_slow_22p.MP4
連番画像(rgba_4chのpng)を23.98fpsのProRes4444で出力
ffmpeg -r ntsc-film -i %05d.png -y -threads 0 -codec:v prores_ks -pix_fmt rgba -profile:v 4444 -bits_per_mb 8000 -vendor ap10 -vf scale=in_color_matrix=bt709:out_color_matrix=bt709 -r ntsc-film output.mov
連番画像(rgba_4chのpng)を23.98fpsのpng codecで出力
ffmpeg -r ntsc-film -i %05d.png -vcodec png -r ntsc-film output_png.mov
H.265 codecで出力
ffmpeg -i input.mp4 -c:v libx265 -crf 22 -tag:v hvc1 output.mp4
切り出し位置を時間(-ssが先頭時間,-tが全長時間)で指定して,23.98fps,yuv422でProResHQ出力
ffmpeg -ss 0.6 -i input_prores4444.mov -t 2.0 -y -threads 0 -codec:v prores_ks -pix_fmt rgba -profile:v 4444 -bits_per_mb 8000 -vendor ap10 -vf scale=in_color_matrix=bt709:out_color_matrix=bt709 -r ntsc-film output_prores4444.mov

参考文献

ffmpegでProRes変換 - 日々適当

ffmpegで連番画像から動画生成 / 動画から連番画像を生成 ~コマ落ちを防ぐには~ - Qiita

ffmpeg alphaチャンネルを扱える動画エンコーダのメモ - 脳内メモ++

Using FFmpeg to Create HEVC Videos That Work on Apple Devices

ffmpeg で指定時間でカットするまとめ | ニコラボ

H.265でエンコード:tech.ckme.co.jp

Colour space conversion from yuv44416le to yuv420p10le using ffmpeg command line tool - Stack Overflow

M5stickV ZERO-ONE (ゼロワンAIカメラ)

M5stickV ZERO-ONE (ゼロワンAIカメラ)

  • M5stickVとKendryte K210が大変興味深かったので,作ってみました.
  • Keras, MobilenetV1のFineTuningで学習しています.
  • Datasetが少ないので,Data Augmetを工夫して,動画の通り満足いく性能が出せました.

f:id:flow-dev:20200421134557p:plain



参考文献

qiita.com

Raspberry Pi 2で, Minecraft(マイクラ)ホームサーバーを作る

はじめに

  • Raspberry Pi 2が余ってたので、Minecraft(マイクラ)ホームサーバーを作ってみた。
  • ヘビーユーザーではないので、Raspberry Pi 2でも快適でした。
  • makecodeでMinecraftのプログラミングすると面白ですよ。

minecraft.makecode.com

作り方

  • ここを参考にしました。

www.makeuseof.com

  • 環境の更新を確認
sudo apt update
sudo apt upgrade
  • raspi-configでOverclockなど各種設定を行う
sudo raspi-config

->Advanced Options > Memory Split > 16MB
->Boot Options > Desktop/CLI > Console
->Overclock > High
->Advanced Options > SSH
->Advanced > Expand Filesystem
  • nukkitサーバー(マイクラサーバー)をinstallする
sudo apt install oracle-java8-jdk
mkdir nukkit
cd nukkit
wget -O nukkit.jar https://ci.nukkitx.com/job/NukkitX/job/Nukkit/job/master/lastSuccessfulBuild/artifact/target/nukkit-1.0-SNAPSHOT.jar
  • nukkitサーバー(マイクラサーバー)を実行する
cd nukkit
sudo java -jar nukkit.jar
  • nukkitサーバー(マイクラサーバー)の設定を変更する

https://sp.ch.nicovideo.jp/komnazsk/blomaga/ar1675635sp.ch.nicovideo.jp

sudo nano server.properties
-> max-players=5
  • nukkitサーバーのpluginをダウンロードしてインストールする

nukkitx.com

cd nukkit
sudo mv MobPlugin-1.9.0.1.jar plugins

ラズパイ起動時にnukkitサーバー(マイクラサーバー)を自動起動する

qiita.com

  • run_nukkit_server.shを作る
cd nukkit
nano run_nukkit_server.sh
  • run_nukkit_server.shの記述内容
#!/bin/bash

#run_nukkit_server.sh

### run server
cd home/hoge/nukkit/
sudo java -jar nukkit.jar
  • /etc/rc.localにrun_nukkit_server.shを追記する
cd /usr/local/bin
ln -s home/hoge/nukkit/run_nukkit_server.sh
sudo nano /etc/rc.local
  • /etc/rc.localの書き方.exit 0の前に.sh名を記載(root権限で実行される)
run_nukkit_server.sh
exit 0
  • 最後リブートしてrun_nukkit_server.shが起動しているか確認
sudo reboot
...(wait...)
ps aux | grep run_nukkit_server.sh

動きました(iphoneでサーバーに入った様子)

f:id:flow-dev:20200328190748p:plain

快適な自宅マイクラサーバーライフを。



iPhoneとopen3Dで快適な3D撮影! Sketchfabに公開

はじめに

  • iPhoneで3D Scanしても全周囲を綺麗に撮影するのは難しい.
  • なので,前面と後面を別々に撮影してから,open3Dで位置合わせした.
  • Sketchfabにuploadして3Dでグリグリ見えるようにした.

sketchfab.com



Capture: 3D Scan Anything

open3D

www.open3d.org

Point cloudを位置合わせするpythonコード

結果

  1. 前面と後面 f:id:flow-dev:20200314185812p:plain

  2. 位置合わせ後 f:id:flow-dev:20200314185832p:plain

  3. Outlier除去(赤が除外点) f:id:flow-dev:20200314185846p:plain

4-1. Outlier除去後(RGB) f:id:flow-dev:20200314185900p:plain

4-2. Outlier除去後(Y) f:id:flow-dev:20200314185920p:plain

4-3. Outlier除去後(Normal) f:id:flow-dev:20200314185936p:plain

5-1. mesh化

5-2. mesh化した領域

まとめ

  • きれいに仕上がると楽しいので,是非お試しください.

https://skfb.ly/6QVJsskfb.ly

UE4でカラーコレクションする(実践編)

はじめに

  • UE4でのカラーコレクションについて.
  • 色再現の異なる複数のカメラデバイスとCGを合成する場合に必要. www.unrealengine.com


LUTCalc

  • .cubeの3DLUTが生成できる.
  • ここで生成した3DLUT.cubeをUE4上で正確に反映させたい. cameramanben.github.io

UE4のLUTテクスチャ

  • UE4では,256x16のLUTテクスチャを使って, カラーコレクションを行うことが出来る. docs.unrealengine.com

LUTテクスチャのリファレンス

  • LUTテクスチャは0-255のRGB階調(Linear値)を16分割した画像.
  • UE4公式からDownload出来るが,内容を理解すため, コード化した.

f:id:flow-dev:20200310080538p:plain https://docs.unrealengine.com/Images/Engine/Rendering/PostProcessEffects/UsingLUTs/RGBTable16x1.png gist.github.com

LUTテクスチャのGammaとGamut

  • UE4上で動作検証した結果,デフォルト設定だと以下の通り.
  • UE4上はsRGB空間のRGB値扱いになっているので,その差分を3DLUT.cubeで生成すればよい.
  • LUTCalcで,Gamma:All->Linear/γ->sRGB(γ2.2), Gamut:All->sRGBを入力とする(出力はお好みで.)
Gamma Gamut
sRGB(γ2.2) sRGB

REDGamma4, REDColor4をターゲットに生成したLUTテクスチャ

  • REDGamma4, REDColor4をターゲットにLUTテクスチャを生成した.
  • UE4でテクスチャが適正露光になっている状態. ポストプロダクションはすべてオフ.

f:id:flow-dev:20200310082549p:plain

LUTテクスチャをUE4に取り込むときの注意

  • LUTテクスチャのpngファイルを取り込み後, Level Of Detailの設定を以下とする.(これをしないと正確に反映されない)
Level Of Detail
Mip Gen Settings -> NoMipmaps
Texture Group -> ColorLookupTable

f:id:flow-dev:20200326101414j:plain

UE4上で現像した結果

LUTなし(デフォルト色)
f:id:flow-dev:20200310082710p:plain
LUTあり(REDGamma4/REDColor4)
f:id:flow-dev:20200310082757p:plain

UE4とLUTCalcの結果を比較検証

  • UE4のLUTなし(デフォルト色)をUE4スクリーンショットした画像をLUTCalc上にLoadして,LUTCalc上でREDGamma4/REDColor4を掛ける.同一ソース画像を,UE4上でLUT現像した画像と,LUTCalc上でLUT現像した画像の比較結果.
  • Look上でほぼ一致していることを確認.

f:id:flow-dev:20200310083231p:plain

まとめ

  • LUTCalcで生成したLUTをUE4上で再現することが出来た.
  • これで,色再現の異なる複数のカメラデバイスとCGを合成する場合のカラーコレクションが容易となる.

付録

  • 出力値確認用のカラーチャート f:id:flow-dev:20200326101718p:plain

  • ffmpegで3DLUTを充てるコマンド

ffmpeg -r ntsc-film -i %d_img_rgb.png -y -threads 0 -b:v 100M -g 1 -vsync 1 -pix_fmt yuv420p -vcodec libx264 -r ntsc-film -vf lut3d="REDGamma4_REDColor4_0-Native.cube" output.mp4

参考リンク