2017-02-19 10 views
0

こんにちは、opencvを使用して、デフォルトのカメラからウェブカメラのフィードを取得し、Windowsフォームのピクチャボックスに表示したいと考えています。私のウェブカメラが来ますが、なんらかの理由で、フィードは決して自分のピクチャボックスに表示されません。私が今ここにこだわっているので、誰かが指摘を助けて問題を解決することができます。 ありがとうございます。 myform.hでOpenCV WebcamフィードはPictureBoxビジュアルスタジオに表示されません2015

、私はmyform.cppファイルへのPictureBoxを送信するには、このコードを持っている:

System::Windows::Forms::PictureBox^ mypicbox1(void) 
{ 
    opencv_gui::MyForm aform; 
    return aform.pictureBox1; 
} 

をしてvideofeedを取得し、myform.cppに私の写真のボックスに入れて描画するコードがあります:

void opencv_gui::DrawCvImage(const cv::Mat& cvImage) 
{ 
    System::Windows::Forms::PictureBox^ pictureBox = mypicbox1(); 
    // only color images are supported 
    assert(cvImage.type() == CV_8UC3); 

    if ((pictureBox->Image == nullptr) || (pictureBox->Width != cvImage.cols) || (pictureBox->Height != cvImage.rows)) 
    { 
     pictureBox->Width = cvImage.cols; 
     pictureBox->Height = cvImage.rows; 
     pictureBox->Image = gcnew System::Drawing::Bitmap(cvImage.cols, cvImage.rows); 
    } 

    // Create System::Drawing::Bitmap from cv::Mat 
    System::Drawing::Bitmap^ bmpImage = gcnew System::Drawing::Bitmap(
     cvImage.cols, cvImage.rows, cvImage.step, 
     System::Drawing::Imaging::PixelFormat::Format24bppRgb, 
     System::IntPtr(cvImage.data) 
    ); 

    // Draw Bitmap over a PictureBox 
    System::Drawing::Graphics^ g = System::Drawing::Graphics::FromImage(pictureBox->Image); 

    g->DrawImage(bmpImage, 0, 0, cvImage.cols, cvImage.rows); 
    pictureBox->Refresh(); 

    delete g; 
} 


//camera feed 
int opencv_gui::video_cap(void) 
{ 
    VideoCapture cap; 

    if (!cap.open(0)) // open the default camera (camera 0), use something different from 0 otherwise; 
     return 0; 
    for (;;) 
    { 
     Mat frame; 
     cap >> frame; 
     if (frame.empty()) break; // end of video stream 
     DrawCvImage(frame); 
     if (waitKey(10) == 27) break; // stop capturing by pressing ESC 
    } 
    // the camera will be closed automatically upon exit 
    // cap.close(); 
    return 0; 
} 

これは私のデバッグログです:私は、エラーパラメータを示すことが重要なパラメータと言葉「RED >>>>>>>」を示すために、「>>>>>>>」のような矢印を使用しています。

  • cvImage {フラグ= 1124024336薄暗くなり= 2行= 480 ...} CV ::マット&
  • アロケータ0x0000000000000000 CV :: MatAllocator *

    cols 640 int

  • データ0x0000026AC2146F80はunsigned char * *(* cvImage)。データ0 '' unsigned char型

  • DATAEND 0x0000026AC2227F80はunsigned char *
  • datalimit 0x0000026AC2227F80はunsigned char *
  • datastart 0x0000026AC2146F80 unsigned char型* は2 INTを暗く フラグ1124024336 int ro WS 480 INT
  • サイズ{P = 0x000000DBDFF0DE80} CV :: MatSize

  • P 0x000000DBDFF0DE80 INT * *(* cvImage).size.p 0 INT

  • ステップ{P = 0x000000DBDFF0DEC8 BUF = {長さ= 2}} CV :: MatStep
  • BUF {長さ= 2}の符号なし__int64 []
  • のp 0x000000DBDFF0DEC8符号なし__int64 *
  • U 0x0000026AA4814780 CV :: UMatData *
  • RED >>>>>>> bmpImage 0x0000026aa62a1fd0 {defaultTransparentColor =}システム::描画::ビットマップ^
  • RED >>>>>>>システム::描画::イメージ^ 0x0000026aa62a1fd0 {nativeImage = 2657511292512 rawData = userData =} System :: Drawing :: Image^ defaultTransparentColor System :: Drawing :: Color gシステム::描画::グラフィックス
  • RED >>>>>>> pictureBox 0x0000026aa62a1388 {borderStyle = System :: Windows :: Forms :: BorderStyle ::なしimage = 0x0000026aa62a1fa0 sizeMode = System :: Windows :: Forms :: PictureBoxSizeMode :: Normal ...}システム:: Windows ::フォーム:: PictureBox^
  • RED >>>>>>> System :: Windows :: Forms: :Control^0x0000026aa62a1388 {ControlKeyboardRouting = PaletteTracing = FocusTracing = ...}システム:: Windowsの::フォーム::コントロール^ AllowDrop偽ブール のBorderStyleシステム:: Windowsの::フォームのBorderStyle :: ::なしシステム:: Windowsの::フォームのBorderStyle :: CausesValidation真ブール
  • CreateParamsを0x0000026aa62a15d8 {className = caption = style = 1442840576 ...}システム:: Windows ::フォーム:: CreateParams^ DefaultImeMode System :: Windows :: Forms :: ImeMode :: Disableシステム:: Windows :: Forms :: ImeMode
  • DefaultSize {幅= 100高さ= 50}システム::描画::サイズ EVENT_SIZEMODECHANGED 0x0000026aa629af50システム::オブジェクト^
  • ErrorImage 0x0000026aa629b110 {nativeImage = 2657511192608 RAWDATA =のuserData =}システム::デッサン: :画像^
  • フォント0x0000026aa6280148 {}システム::描画::フォント^
  • 前景色{RGB = 0x0の}システム::描画::カラー
  • 画像0x0000026aa62a1fa0 {nativeImage = 2657511290992 RAWDATA =のuserData =}システム。 :デッサン::イメージ^
  • [システム::描画::ビットマップ^] 0x0000026aa62a1fa0 {defaultTransparentColor =}システム::描画::ビットマップ^
  • システム::のMarshalByRefObject^0x0000026aa62a1fa0 {__identity =}システム::のMarshalByRefObject^ フラグ2 int
  • FrameDimensionsList {Length = 1} array^ 高さ480 INT Horizo​​ntalResolution 96.000000フロート
  • パレット0x0000026aa62a25e8 {フラグ= 1129621568のエントリ= {長さ= 0}}システム::描画::イメージング:: colorPaletteは^
  • PhysicalDimension {幅= 640.00000高さ= 480.00000}システム。 :デッサン:: SizeF PixelFormatプロパティシステム::描画::イメージング:: PixelFormatプロパティ:: Format32bppArgbシステム::描画::イメージング:: PixelFormatプロパティ PropertyIdList {長さ= 0}アレイ^ PropertyItems {長さ= 0}アレイ^
  • RawFormat 0x0000026aa62a3488システム::描画::イメージング::画像フォーマット^
  • サイズ{幅= 640高さ= 480}システム:: D rawing :: Size タグシステム::オブジェクト^ VerticalResolution 96。000000フロート 幅640 INT nativeImage 2657511290992 __int64 RAWDATAアレイ^ のuserDataシステム::オブジェクト^ ImageLocationシステム::文字列^
  • ImageRectangle {X = 0、Y = 0の幅= 640高さ= 480}システム::デッサン:: Rectangle ImeMode System :: Windows ::フォーム:: ImeMode ::無効化システム:: Windows ::フォーム:: ImeMode
  • InitialImage 0x0000026aa629c568 {nativeImage = 2657511196256 rawData = userData =}システム::描画::画像^ PICTUREBOXSTATE_asyncOperationInProgress 1 int PICTUREBOXSTATE_cancellationPending 2 int PICTUREBOXSTATE_inInitialization 64 int PICTUREBOXSTATE_needToLoadImageLocation 32のint PICTUREBOXSTATE_useDefaultErrorImage 8 int型 PICTUREBOXSTATE_useDefaultInitialImage 4 int型 PICTUREBOXSTATE_waitOnLoad 16のint型 rightToLeftのシステム:: Windowsの::フォーム:: rightToLeftの::いいえシステム:: Windowsの::フォーム:: rightToLeftの のSizeModeシステム:: Windowsの::フォーム:: PictureBoxSizeMode ::ノーマルシステム:: Windowsの::フォーム:: PictureBoxSizeMode のTabIndex 1 int型 タブストップ偽ブール値 テキスト "" システム::文字列^ 偽ブール のborderStyleシステムをWaitOnLoad :: Windowsの::フォーム::のBorderStyle: :なしSystem :: Windows :: Forms :: BorderStyle contentLength 0 int currentAsyncLoadOperationシステム: :ComponentModel :: AsyncOperation^ currentlyAnimating偽ブール
  • defaultErrorImage 0x0000026aa629b110 {nativeImage = 2657511192608 RAWDATA =のuserData =}システム::描画::イメージ^
  • defaultErrorImageForThread 0x0000026aa629b110 {nativeImage = 2657511192608 RAWDATA =のuserData =}システム::デッサン::イメージ^ defaultErrorImageKey 0x0000026aa629af08システム::オブジェクト^
  • defaultInitialImage 0x0000026aa629c568 {nativeImage = 2657511196256 RAWDATA =のuserData =}システム::描画::イメージ^
  • defaultInitialImageForThread 0x0000026aa629c568 {nativeImage = 2657511196256 RAWDATA =のuserData =}システム。 :ドローイング::イメージ^ defaultInitialImageKey 0x0000026aa629aef0システム::オブジェクト^
  • errorImage 0x0000026aa629b110 {nativeImage = 2657511192608 RAWDATA =のuserData =}システム::^ が偽のブール値をhandleValid描画::イメージ
  • 画像0x0000026aa62a1fa0 {nativeImage = 2657511290992 RAWDATA =のuserData =}システム。 :描画::イメージ^ imageInstallationType ImageInstallationType :: DirectlySpecified ImageInstallationType imageLocationシステム::文字列^
  • initialImage 0x0000026aa629c568 {nativeImage = 2657511196256 RAWDATA =のuserData =}システム::描画::イメージ^
  • [システム::デッサン::ビットマップ^] 0x0000026aa629c568 {defaultTransparentColor =}システム::描画::ビットマップ^
  • システム::のMarshalByRefObject^0x0000026aa629c568 {__identity =}システム::のMarshalByRefObject^ フラグ73744 INT
  • FrameDimensionsList {長さ= 1}アレイ^ 高さ16 INT Horizo​​ntalResolution 96.000000フロート
  • RED >>>>>>>パレット0x0000026aa629ea60 {フラグ= 951278840のエントリ= {長さ= 0}}システム::描画::イメージング:: colorPaletteは^
  • PhysicalDimension {幅= 14.000000高さ= 16 。000000} System :: Drawing :: SizeF PixelFormat System :: Drawing :: Imaging :: PixelFormat :: Format24bppRgb System :: Drawing :: Imaging :: PixelFormat PropertyIdList {長さ= 0}配列^ PropertyItems {長さ= 0}配列^
  • RED >>>>>>> RawFormat 0x0000026aa629f900 {...} System :: Drawing :: Imaging :: ImageFormat^
  • サイズ{幅=高さ= 16}システム::描画::サイズ タグシステム::オブジェクト^ VerticalResolution 96.000000フロート 幅14 int型 nativeImage 2657511196256 __int64 RAWDATA配列^ のuserDataシステム::オブジェクト^ RED >>>>>>>内部yncObject 0x0000026aa629d900システム::オブジェクト^ loadCompletedDelegateシステム::スレッディング::^ loadCompletedKey 0x0000026aa629af20システムSendOrPostCallback ::オブジェクト^ loadProgressChangedKey 0x0000026aa629af38システム::オブジェクト^ loadProgressDelegateシステム::スレッディング:: SendOrPostCallback^ localImageStreamReaderシステム:: IO: :StreamReaderを^
  • pictureBoxState {データ= 12}システム::コレクション::専用:: BitVector32 readBlockSize 4096 INT のReadBufferアレイ^
  • savedSize {幅= 640高さ= 480}システム::描画::サイズ sizeMode System :: Windows :: Forms :: PictureBoxSizeMode ::通常のシステム:: Windowsの::フォーム:: PictureBoxSizeMode tempDownloadStreamシステム:: IO ::のMemoryStream^ totalBytesRead 0 int型 uriImageStreamシステム:: IO ::ストリーム^
+0

私は同期が見当たらないので、メインのGUIスレッドで 'opencv_gui :: video_cap'が実行されると仮定します。したがって、無限ループを見ると、既に潜在的なトラブルの兆候があります。 'waitKey'はちゃんと働くかもしれませんが、OpenCV UI以外のものには依存しません。これはとにかくGUIアプリではかなり厄介なデザインです。あなたはすでにフレーム間で待機していますので、なぜタイマーを使用しないのですか? –

+0

コメントをいただきありがとうございました。私はすぐにループに関してコードをクリーンアップしようと考えていますが、ループを削除して手動でキャプチャすることは、私の主な問題である画像ボックスにフレームを表示しません。 –

+0

デバッガでその機能をステップ実行することはできますか? 'cvImage.cols、cvImage.rows、cvImage.step'の値は何ですか? 'cvImage.data'には妥当な値が含まれていますか?ところで、OpenCV画像はBGRであり、データをRGBと解釈します。おそらく 'cvtColor'が必要です。 –

答えて

0

は私のコードビットを編集する必要がありましたが、私はかなり私を解きますここで提供されている答えを使用して問題を解決してください: https://stackoverflow.com/a/12628861/5728859

関連する問題