Open CVでBitmap描画の高速化方法

このQ&Aのポイント
  • Open CVとVC++2008のC++/CLIを使用し、カメラ画像を表示するプログラムを作成しています。
  • カメラ画像の描画だけではなく、他の処理を行うと全体の動作が遅くなるため、Bitmapの描画を高速化したいと考えています。
  • しかし、どのようにすればBitmap描画を高速化することができるのかわかりません。ご教授いただける方がいらっしゃいましたら、お願いします。
回答を見る
  • ベストアンサー

Open CV でBitmap描画の高速化

 現在Open CVとVC++2008のC++/CLIを用いてform上のpictureBoxにカメラ画像を表示するプログラムを作成しています。  プログラムは,http://imagingsolution.blog107.fc2.com/blog-entry-91.htmlのサイトの『IplImageのPictureBoxへの描画』の項を参考にさせていただきました。 カメラ画像の描画だけでしたら,問題なく動作しますが,その他の処理を行うと,全体の動作が遅くなってしまいます。 そこで,どうにかして全体の動作速度あげようと,調べているとBitmapの描画は遅いということはわかりました。 しかし,どのようにすればBitmap描画を高速化出来るのかがわかりません... お分かりになる方がいらっしゃいましたら,何卒ご教授お願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
  • hidebun
  • ベストアンサー率50% (92/181)
回答No.1

現状、どの程度の時間がかかっていて、どの程度まで高速化したいのでしょうか? パフォーマンスのチューニングは、具体的に数値目標設定しないと、答えようがありません。 マシンやOS、使用言語によっても速度は変わりますし、そもそも、現状がその構成での 限界の速度なのかもしれません。表示するデータのサイズが大きすぎるのかもしれません。 それから、「その他の処理」というのは、Bitmapの描画とは別に、 マルチスレッドなどで並列に処理できないものなのでしょうか?

関連するQ&A

  • Open CVについて

    現在,OpenCVとVC++2008のC++/CLIでwindows formアプリケーションを作成しています。 フォーム上のpictureBoxにUSBカメラから取得した画像を,録画しながら,pictureBoxに表示させています。しかし,取り込んだ画像が,pictureBoxに収まり切っていないようです。(添付画像のようなに枠内の画像に対して,肌色部分しか,pictureBoxに表示されていない状態) コードは http://hisoap.jugem.jp/?eid=156 を参考に,以下のように記述しています。 CvCapture *capture srcImage = cvQueryFrame(capture); Bitmap^ bmpPicBox = gcnew Bitmap(pictureBox->Width, pictureBox->Height); pictureBox->Image = bmpPicBox; Graphics^g = Graphics::FromImage(pictureBox->Image); Bitmap^ bmp = gcnew Bitmap(pictureBox->Width, pictureBox->Height, srcImage->widthStep,System::Drawing::Imaging::PixelFormat::Format24bppRgb, IntPtr(srcImage->imageData)); g->DrawImage(bmp, 0, 0, srcImage->width , srcImage->height); どのようにすれば,画像をpictureBoxにぴったりと表示させることができるでしょうか?

  • Open CVについて

    現在Open CVを用いて,VC++2008 ExpressのWindows Formアプリケーションを作成しています。 main_formのpictuteBoxにUSBカメラから画像を取得して表示し,sub_formはアプリケーションの設定用フォームで,USBカメラの解像度などの情報を取得して表示しようとしています。 main_form.hの先頭部分に以下のように記述しています。 #include <cv.h> #include <highgui.h> #include "sub_form.h" CvCapture *capture1 = 0; sub_formの先頭部分に以下のように記述しています。 #include "main_form.h" #include <cv.h> CvCapture *capture2 = 0; 上記のように記述後,ビルド使用とすると, 『...\sub_form.h(457) error C2065: 'CvCapture' : 定義されていない識別子です。』 と,sub_formのみでエラーが出てしまいます。 cv.hをインクルードしているのに,なぜこのようなエラーがでてしまうのでしょうか? お分かりになる方がいらっしゃいましたら,ご教授宜しくお願い致します。

  • Bitmap画像の消去について

    やりたいこととして Bitmap画像を表示する前になにかしら背景が描画されています。 そしてボタンを押すとか何かしらイベントが起こったときにBitmap画像を描画します。 そしてまたボタンを押すと背景はそのままでそのBitmap画像だけを消去する ということがしたいです。 今、ピクチャーボックスを使ってBitmap画像を表示することはできます。 ただそのBitmap画像を消去することはできていません。 探しているとピクチャーボックスを白く塗りつぶして、背景を再描画するって方法はあるのですが、いろいろあってその方法は使いたくないです。 Bitmap画像だけを消去する方法はあるのでしょうか? OSはVistaで、VC++2003.netを使っています。 宜しくお願いします。

  • VisualStudioのpictureBox

    VC++2008でC++/CLIでpictureBoxにグラフを描画するプログラムを作成しています。 最大値を200程度にしたいのですが,約180以上の数値を入れるとpictureBoxの上部に点が描画されているようです。(pictureBoxの外側なので,点は見えませんが...) 最大値を200,最小値を0としたら,pictureBoxの最上部が200,最下部が0 になるようなプログラムはどのようにすればよいでしょうか? 座標は左下が原点になるようには設定しています。

  • VB.NETでPictureBoxへの描画について

    VB.NETでPictureBoxへの描画について PictureBoxに画像を表示し、余白部分を含めて、マウスで描画できる処理を作成しているのですが、 どうも上手くいかない為、皆さんの知恵をお借りしたいと思い質問させて頂きました。 まず、880×560のPictureBoxを用意し、その中に、600×480の画像を埋め込んでいます。 そのPictureBoxの中で、画像以外の部分(余白)にもマウスで線等を書きたいのです。 画像のみに描く場合は上手くいくのですが、余白を含めると上手くいかなくなってしまい、 困っております。 プログラムの違いは以下の箇所のみです。2の場合は上手くいきます。 1.PictureBox全体に描画する(画像も含め) Dim g As Graphics = PictureBox1.CreateGraphics 2.画像のみに描画する Dim g As Graphics = Graphics.FromImage(PictureBox1.Image) ちなみに、マウスではなく、ボタンクリック時に描画した時は、1の場合でも上手くいきます。 お手数ですが、ご回答の程、よろしくお願いします。

  • MFCでのBITMAP作成について

    VC++2005MFCで開発しています。 カメラからの画像入力の部分を作成しているのですがchar配列からのカラーbitmapの作成の仕方が分かる方いませんでしょうか? 直接ファイルに書き込む方法ですとフォーマット通りに書き込めば良いとは思うのですが、画面表示をしたいのでCBitmap又はHBitmapで取得したいです。 調べていると、モノクロだとSepBitmapBitsでできそうです。 しかし、msdnを見るとカラーの場合はSetDIBitsを使用しろとあるのですが、SetDIBitsの項を見ると何か思っている用法と違いそうです。 また、VC++.NETですとDrawing::Bitmap(( width, height, stride, format, scan0);でフォーマットを指定して作成できそうなのですが、それに相応するようなものはないかと探しているのですが見つかりません。 すいませんがご教授お願いします。

  • C#のpictureBoxの描画のタイミング

    C#のpictureBoxの描画について質問します。 drawにpictureBoxの描画コードが有りますがあり、Form1() の InitializeComponent();の 後(コードA)では、描画できませんが、button1_Click(コードB)では、描画できるようです。 Q1)プログラムの起動時に、描画できる方法はありますか? public Form1() { InitializeComponent(); 処理コード draw(); //コードA } private void button1_Click(object sender,EventArgs e) { draw(); //コードB }

  • VB PictureBoxの描画範囲

    VisualStudio2010のVBにて、ピクチャーボックスの範囲をプログラム中で大きくして描画をさせたいのですが、ピクチャーボックスのサイズを大きくしても、大きくした範囲には描画がされません。 やり方は↓の方法です。 まず、formにボタンとピクチャーボックスを300×200で配置して、 http://homepage1.nifty.com/rucio/main/dotnet/Samples/dnSampleKeepImage.htm ↑のページで書かれてた方法でグラフィックを再描画させています。 Public Class Form1 Private Sub Button1_Click_1(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Dim g As Graphics = AutoGraphics(PictureBox1) PictureBox1.Width = 400 g.FillRectangle(Brushes.Black, 100, 100, 10, 10) '1つ目の図形 g.FillRectangle(Brushes.Black, 350, 100, 10, 10) '2つ目の図形 g.Dispose() End Sub Public Function AutoGraphics(ByVal picSource As PictureBox) As Graphics If picSource.Image Is Nothing Then picSource.Image = New Bitmap(PictureBox1.Width, PictureBox1.Height) End If Return Graphics.FromImage(picSource.Image) End Function End Class これを実行すると、1つ目の図形は描画されていますが、拡大した範囲にある2つ目の図形は描画されていません。 ピクチャーボックスの範囲を大きくした所にも描画をさせたいと思っています。 よろしくお願いします。

  • Open CVによる動画保存について

    現在,Open CVを使用して,webカメラからから取得した映像を動画として保存しようとしています。 公式サイトや参考書のコードを丸写ししテストしています。 コンソールアプリケーションで作成した場合は,問題なく動画を保存できましたが,フォームアプリケーションで作成した場合,エラーで停止してしまいます。 動作としては,timerを使用して,30msec間隔でカメラから画像を取得し,動画として保存というものです。 CvCapture *capture;//画像 CvVideoWriter* rec; IplImage *srcImage; private: System::Void Form1_Load(System::Object^ sender, System::EventArgs^ e) { timer1->Interval=30; timer1->Enabled=true; capture = cvCaptureFromCAM(0); srcImage = cvQueryFrame(capture); rec = cvCreateVideoWriter("movie.avi",CV_FOURCC('M','J','P','G'),30,cvSize(100,100)); } private: System::Void timer1_Tick() {    captureImage(); } private:System::Void captureImage(void){ cvFlip(srcImage,srcImage,0); srcImage=cvQueryFrame(capture); cvWriteFrame(rec,srcImage); } 上記の, cvWriteFrame(rec,srcImage); の箇所で停止してしまいます。 ビルドは成功しているのですが,実行時の1目でエラーになります。 エラー内容『保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。』 どなたか原因がわかるかたがいらっしゃいましたら,ご教授いただけますでしょうか?

  • 複雑な形状のRegion作成

    CLI .NetFrameWorkでPictureBoxを複数重ねて背景の透過処理を行っています。 フォームには多数のPictureBoxがあり、親子関係がうなくできない為、最全面にあるPictureBox1のRegion領域を設定しようと考えています。 しかし、透過させたいPictureBox1には、複雑な形状のBitmap(PNG形式)が描画されている為、Regionを手作業で設定するのが困難です。 「Bitmapの透明でない領域をRegionに設定」みたいな処理はできないでしょうか? また、その他、複数のPictureBoxに対する背景の透過処理などありましたら、ご教授の程、よろしくお願いいたします。m(_ _)m

専門家に質問してみよう