こんにちは、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 HorizontalResolution 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 HorizontalResolution 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 ::ストリーム^
私は同期が見当たらないので、メインのGUIスレッドで 'opencv_gui :: video_cap'が実行されると仮定します。したがって、無限ループを見ると、既に潜在的なトラブルの兆候があります。 'waitKey'はちゃんと働くかもしれませんが、OpenCV UI以外のものには依存しません。これはとにかくGUIアプリではかなり厄介なデザインです。あなたはすでにフレーム間で待機していますので、なぜタイマーを使用しないのですか? –
コメントをいただきありがとうございました。私はすぐにループに関してコードをクリーンアップしようと考えていますが、ループを削除して手動でキャプチャすることは、私の主な問題である画像ボックスにフレームを表示しません。 –
デバッガでその機能をステップ実行することはできますか? 'cvImage.cols、cvImage.rows、cvImage.step'の値は何ですか? 'cvImage.data'には妥当な値が含まれていますか?ところで、OpenCV画像はBGRであり、データをRGBと解釈します。おそらく 'cvtColor'が必要です。 –