(Web カメラから) キャプチャされた OpenCV 画像または対応する float 配列の配列をアップサンプリングしたい (ピクセル値は離散整数である必要はありません)。残念ながら、アップサンプリング比は常に整数であるとは限らないため、単純な線形補間でそれを行う方法を自分で理解することはできません. これを行うためのより簡単な方法またはライブラリはありますか?
4 に答える
フレームレートのスケーリングを行うためのライブラリがわかりません。
しかし、自分で行う最も適切な方法は、フレームをドロップまたはダブリングすることです。
単純な線形ピクセル補間によって画像をブレンドしても品質は向上しません。再生は依然としてぎくしゃくしたり、ぼやけたりします。
フレームレートを適切に補間するには、はるかに複雑なアルゴリズムが必要です。最近のテレビにはそのためのハードウェアが組み込まれており、After-Effects などのビデオ編集ソフトウェアにはそれを行う機能があります。
これらのアルゴリズムは、動きの分析によって写真の間に作成することができます。しかし、それは小さな問題解決の範囲を超えています。
したがって、使用できる既存のライブラリを探し続けるか、フレームをドロップ/ダブリングするだけでそれを行います。
libswscale
ffmpeg プロジェクトから使用します。これは最も最適化されており、さまざまなリサンプリング アルゴリズムをサポートしています。
私はビデオ キャプチャに 100% 精通しているわけではないので、「ピクセル値は離散整数である必要はない」という意味がわかりません。これは、ピクセルごとの色情報が整数ではない可能性があることを意味しますか?
「アップサンプリング比が常に整数であるとは限らない」とは、ある解像度から別の解像度にアップサンプリングすることを意味すると想定していますが、2 倍または 3 倍にはならない可能性があります。たとえば、640x480 -> 1280x960 の代わりに、640x480 -> 800x600 を実行している可能性があります。
単純なアルゴリズムは次のようになります。
大きなグリッドの各ピクセル
- x/y 値が 0,1 の間に収まるようにスケーリングします (x を幅で、y を高さで割ります)。
- 小さい方のグリッドの幅/高さで x/y 値をスケーリングします -> xSmaller、ySmaller
- 浮動小数点の床/天井関数を使用して、ポイントを含む 4 つのピクセルを決定します。
- ポイントがその長方形内にある場所の x/y 値を
0,1 の間で取得します (床/天井の値 xSmaller、ySmaller を減算します) -> xInterp、yInterp - 黒から始めて、それぞれの xInterp/yInterp 係数でスケーリングされた 4 つの色を追加します。
ルックアップ テーブルを作成してピクセルをマップすることにより、複数のフレームでこれを高速化できます - > xInterp/yInterp 値
線形補間よりもはるかに優れたアルゴリズムがあると確信しています (バイリニアなど)。これは、プロセッサ レベルで最適化したいもののように思えます。
ImageMagick MagickWandライブラリは、適切なフィルタリング アルゴリズムを使用して画像のサイズを変更しますMagickResizeImage()
。関数を参照してください (および Sinc フィルタを使用してください)。