現在USBWebカメラを利用し、画像処理をしたのちに画像をJPEG形式で保存するというプログラムを作成しています。
入力画像ビットマップデータをINT配列化⇒画像処理⇒INT配列をBufferedImageに変換⇒JPEGで保存
という流れです。
このとき、以下のコードでBufferedImageをJPEGで保存しています。
public void saveJpgbuf(BufferedImage ssimg ,String fname ) throws IOException {
//ImageIO.setUseCache(true);//プログラムの初めで実行済み
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpeg").next();
ImageOutputStream out = ImageIO.createImageOutputStream(new File("c:\\"+fname + ".jpg"));
writer.setOutput(out);
writer.write(ssimg);
out.close();
}
しかし、この処理が非常に重いようで、現状のノートPC(Corei5 2.56GHz)では一画像の保存に20msはかかってしまうようです。
保存先をramdiskに変えても17msはかかります。
他の処理と比べてこの保存処理のコストが非常に高く、全体のパフォーマンスを低下させています。
このような処理を高速化できる方法はありませんでしょうか?
No.4ベストアンサー
- 回答日時:
(追記)
あと、そもそもリアルタイムの画像処理はデータ量や計算量が多すぎてソフトウェアではなく専用のハードウェアに処理させるのが一般的だと思います。
つまり、ソフトウェアでやろうとしていること自体に無理があると思います。3Dゲームなどもハードウェア処理のおかげで秒30フレーム以上で処理ができるわけで、ソフトウェアでやれば秒10フレームでればいいということもあります。
ソフトウェアで処理を行う場合、入力画像の解像度を下げることや秒あたりのフレーム数を減らさざるを得ません。基本的に高性能なマシンを使用することや、CPUアーキテクチャとの相性も考慮する必要があります。
Intel の CPU は互換性に優れていると言えるが、時代遅れとも言えるかもしれない。(アーキテクチャが)と、まだまだ勉強不足ながらそんな印象を最近受けました。
あとは、画像圧縮処理を高速化することですかね。こんなのありました。
http://jpn.nec.com/press/201211/20121105_03.html
まあ、ご参考までに。
ありがとうございます。参考になります。
私の研究におけるこの処理は、当初ハードウェアでやろうと検討したら5000万の機械が必要と言われ、ソフトウェアでできたら安く済むな、という経緯がありました。
ソフトウェアで成果が上がれば、専用ハードウェアを頼めるのです。
とりあえずは今あるハードウェア(CPU,GPU,SSD等)をうまく使って解決していきます。
No.3
- 回答日時:
>すでにマルチスレッド化されており、画像処理後のBufferedImageを他のスレッドに受け渡し、他のスレッドでJPEG保存を行っています。
だったらもうその処理だけC/C++でネイティブ化(Windowsならdll)して作る。
ありがとうございます。
もうこれ以上はJAVAでは不可能ということですかね・・・。
C等で一部処理を行う必要があるなら、いっそOpenCV等に移植を検討してみます。
No.2
- 回答日時:
いや、ちょっと、秒あたり何フレーム処理させようとしているの?
20ms なら秒あたり50フレーム分はできるし・・・。
ハイスピードカメラでも作ろうとしているの?
(http://ja.wikipedia.org/wiki/ハイスピードカメラ)
そもそも、あなたの使っているUSBWebカメラの性能はいくつですか?
http://www.amazon.co.jp/dp/B002J4UA9G/
カメラ・最大フレームレート : ~1280×720ピクセル時 : 30fps、、1600×1200ピクセル時 : 10fps、2048×1536ピクセル時 : 10fps
普通のカメラなら秒30フレームですよ!!
本題
タイマを使って秒30フレームでカメラの画像を取得するように入力系を設計し直すのが適当と思います。
ただ、タイマは精度に注意が必要ですね・・・。
タイマの精度が問題ないか事前にテストして見てください。
ありがとうございます。
秒あたりの処理フレーム数については以下の理由から早ければ早いほどいいのです。
(1)今後60FPSのUSB接続のカメラ(業務用の内視鏡や眼球カメラ等を含む)、を接続するかもしれない。
(2)現在の私の研究では 1フレームの1枚の画像から4枚の画像を生成し、それを連ねた動画にする、という処理をしています。
そのため、入力は15FPSでもよいのですが、出力は60
FPSの速度で保存できなければ、バッファに蓄積され続けてしまうのです。
ちなみに画像処理部は1フレーム取得から4フレーム分のデータ生成までで約60msで終わります。
とりあえず15FPSでJPEGファイルを保存して、そのあと画像処理という風にすればもちろん解決するのですが、それだとリアルタイム性に欠けるのです。
No.1
- 回答日時:
マルチスレッド化して画像処理をメイン処理と切り離して裏で処理させて見た目的だけでも処理が止まったような状態ではなくしておく。
ありがとうございます。
が、すみません。説明が足りませんでした。
すでにマルチスレッド化されており、画像処理後のBufferedImageを他のスレッドに受け渡し、他のスレッドでJPEG保存を行っています。
このとき、画像処理と並列で行っているので、処理時間は20msより長くかかっています。
このJPEG保存の速度が遅いために、保持するBufferedImageが多くなりすぎてメモリが一杯になってしまうのです。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) EXCELのグラフを画像(JPG形式)で保存、通常実行がうまく行かない。ステップインはうまく行く 3 2022/08/30 12:06
- 一眼レフカメラ 「Imaging Edge」を手動起動せず、ARWファイルを最高画質JPEGへ変換する方法は? 2 2022/08/05 11:38
- 画像編集・動画編集・音楽編集 jpgが拡張子の画像を探しています 2 2023/04/06 10:03
- Excel(エクセル) EXCELマクロでandroidタブレットから取りんだJPEGファイルをうまくセルに貼り付けられない 2 2022/07/31 15:03
- デスクトップパソコン スマホからメール添付でパソコンへ送った画像が開かない 4 2023/06/06 17:19
- 写真 log撮影について。今まで、9割がた映像ではなく写真をlog撮影でとってきました。 映像ではlogの 3 2023/07/04 23:28
- Google Drive googleフォトの写真を外付けHDDに保存する方法について。 4 2022/09/21 23:36
- その他(プログラミング・Web制作) 監視カメラを水平につないでパノラマの映像を作りたい 1 2022/09/06 15:26
- C言語・C++・C# このプログラミング誰か教えてくれませんか 1 2022/06/02 15:27
- PHP imageフォルダに、画像をリサイズして保存する時のファイル名を変更したい 1 2023/05/30 11:39
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
tryの終了
-
DBのinsert/updateを1ボタンで...
-
ftp 同時複数接続の負荷テスト...
-
SwingUtilities.invokeLater(ne...
-
スレッド1とスレッド2を交互に...
-
WaitForSingleObjectの復帰時間
-
JavaScriptからJAVAクラスを呼...
-
doGetとdoPostの違い
-
[Java] while(true)の意味
-
Tomcat高負荷時の設定について
-
Javaでのデバッグコード削除
-
エクセルVBAで、条件に一致する...
-
「タイプ初期化子が例外をスロ...
-
オブジェクト指向プログラミン...
-
生成したインスタンスを削除す...
-
変数名の付け方
-
servletからjspへオブジェクト...
-
レコード件数の表示
-
複数の変数を宣言する時、同時...
-
private static という変数の修飾
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
tryの終了
-
数値の定数を付ける時
-
Javaでのデバッグコード削除
-
C#で別スレッドの終了を知りたい
-
[Java] while(true)の意味
-
Tomcatのスレッドを破棄する方法
-
Javaプログラムからポップアッ...
-
ラジオボタンの選択判定
-
JavaScriptからJAVAクラスを呼...
-
WPF C#でF10のイベント取得方法...
-
PHPでDB処理中にプログレスバー...
-
素数判定を再帰処理で
-
Javaアプリケーション実行の返...
-
switch文の中に、throws new Ex...
-
doGetとdoPostの違い
-
JDBCでテーブルUPDATE後の再検...
-
Tomcat高負荷時の設定について
-
ラベルの表示までが異常に遅い...
-
ExcelVBA で文字列の特定の文字...
-
SwingUtilities.invokeLater(ne...
おすすめ情報