2017-02-19 1 views
0

Привет, поэтому я использовал opencv для получения веб-камеры с моей камеры по умолчанию, и я хочу отобразить ее в окне изображения в моей форме окна. Моя веб-камера появляется, но по какой-то причине фид никогда не отображается на моем графическом ящике. Пожалуйста, может кто-то помочь указать/решить проблему, поскольку я застрял здесь прямо сейчас. Спасибо заранее.Корзика веб-камеры OpenCV не отображается в Visual Studio 2015 2015

В myform.h, у меня есть этот код, чтобы отправить PictureBox в файл myform.cpp:

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 ...} резюме :: Mat &
  • Распределитель 0x0000000000000000 резюме :: MatAllocator *

    cols 640 int

  • 0x0000026AC2146F80 данные без знака символ * * (* cvImage).Данные 0 '' неподписанные символ

  • dataend 0x0000026AC2227F80 неподписанные символ *
  • DATALIMIT 0x0000026AC2227F80 неподписанные символ *
  • datastart 0x0000026AC2146F80 неподписанные символ * тускнеет 2 ИНТ флаги 1124024336 int ro WS 480 INT
  • размер {р = 0x000000DBDFF0DE80} резюме :: MatSize

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

  • шаг {р = 0x000000DBDFF0DEC8 ЬиЕ = {длина = 2}} резюме :: MatStep
  • ЬиЕ {длина = 2} беззнаковое __int64 []
  • р 0x000000DBDFF0DEC8 беззнаковое __int64 *
  • у 0x0000026AA4814780 резюме :: UMatData *
  • RED >>>>>>> bmpImage 0x0000026aa62a1fd0 {defaultTransparentColor =} System :: Рисование :: Bitmap^
  • RED >>>>>>> System :: Drawing :: изображение^0x0000026aa62a1fd0 {nativeImage = 2657511292512 rawData = userData =} Система :: Рисование :: Изображение^ defaultTransparentColor System :: Drawing :: Color g Система :: Чертеж :: Графика^
  • RED >>>>>>> pictureBox 0x0000026aa62a1388 {borderStyle = System :: Windows :: Forms :: BorderStyle :: None image = 0x0000026aa62a1fa0 sizeMode = System :: Windows :: Forms :: PictureBoxSizeMode :: Normal ...} System :: Windows :: Forms :: PictureBox^
  • RED >>>>>>> Система :: Windows :: Forms: : Control^0x0000026aa62a1388 {ControlKeyboardRouting = PaletteTracing = FocusTracing = ...} System :: Окна :: Forms :: Control^ AllowDrop ложные BOOL BorderStyle системы :: Окна :: Forms :: BorderStyle :: Без системы :: Окна :: Forms :: BorderStyle CausesValidation истинный BOOL
  • CreateParams 0x0000026aa62a15d8 {className = caption = style = 1442840576 ...} System :: Windows :: Forms :: CreateParams^ DefaultImeMode System :: Windows :: Forms :: ImeMode :: Disable System :: Windows :: Forms :: ImeMode
  • DefaultSize {ширина = 100 высота = 50} система :: Чертеж :: Размер EVENT_SIZEMODECHANGED 0x0000026aa629af50 система :: Объект^
  • ErrorImage 0x0000026aa629b110 {nativeImage = 2657511192608 RAWDATA = USERDATA =} система :: Чертеж: : Изображение^
  • шрифт 0x0000026aa6280148 {} System :: Drawing :: Font^
  • ForeColor {RGB = 0x0} System :: Drawing :: Цвет
  • Image 0x0000026aa62a1fa0 {nativeImage = 2657511290992 RAWDATA = USERDATA =} Система: : Drawing :: изображение^
  • [System :: Рисование :: Bitmap ^] 0x0000026aa62a1fa0 {defaultTransparentColor =} System :: Рисование :: Bitmap^
  • System :: MarshalByRefObject^0x0000026aa62a1fa0 {__identity =} System :: MarshalByRefObject^ Флаги 2 int
  • FrameDimensionsList {Length = 1} array^ Высота 480 ИНТ HorizontalResolution 96,000000 поплавок
  • Palette 0x0000026aa62a25e8 {флаги = 1129621568 записи = {Length = 0}} Система :: Рисование :: Imaging :: ColorPalette^
  • PhysicalDimension {ширина = 640,00000 высота = 480,00000} Система: : Рисунок :: SizeF PixelFormat System :: Рисование :: визуализации :: PixelFormat :: Format32bppArgb System :: Drawing :: визуализации :: PixelFormat PropertyIdList {Length = 0}^массив PropertyItems {Length = 0}^массив
  • RawFormat 0x0000026aa62a3488 {...} Система :: Рисование :: Изображения :: ImageFormat^
  • Размер {Ширина = 640 Высота = 480} Система :: D rawing :: Размер Система тегов :: Объект^ VerticalResolution 96.000000 Поплавок Ширина 640 INT nativeImage 2657511290992 __int64 RAWDATA массив^ USERDATA Система :: Объект^ ImageLocation Система :: Строка^
  • ImageRectangle {Х = 0 Y = 0 Ширина = 640 Высота = 480} Система :: Чертеж :: Rectangle ImeMode System :: Windows :: Forms :: ImeMode :: Disable System :: Windows :: Forms :: ImeMode
  • InitialImage 0x0000026aa629c568 {nativeImage = 2657511196256 rawData = userData =} System :: Drawing :: Image^ 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 System :: Окна :: Forms :: RightToLeft :: Нет системы :: Окна :: Forms :: RightToLeft SizeMode System :: Окна :: Формы :: PictureBoxSizeMode :: Обычная система :: Окна :: Forms :: PictureBoxSizeMode TabIndex 1 INT TabStop лжи Их текста "" System :: String^ WaitOnLoad ложного логического значения BorderStyle System :: Windows, :: Forms :: BorderStyle: : Нет Система :: Windows :: Forms :: BorderStyle contentLength 0 int currentAsyncLoadOperation System: : ComponentModel :: AsyncOperation^ currentlyAnimating ложное логическое значение
  • defaultErrorImage 0x0000026aa629b110 {nativeImage = 2657511192608 RAWDATA = USERDATA =} Система :: Рисование :: Изображение^
  • defaultErrorImageForThread 0x0000026aa629b110 {nativeImage = 2657511192608 RAWDATA = USERDATA =} System :: Drawing :: изображение^ defaultErrorImageKey 0x0000026aa629af08 System :: Object^
  • defaultInitialImage 0x0000026aa629c568 {nativeImage = 2657511196256 RAWDATA = USERDATA =} System :: Drawing :: изображение^
  • defaultInitialImageForThread 0x0000026aa629c568 {nativeImage = 2657511196256 RAWDATA = USERDATA =} система: : Рисование :: Изображение^ defaultInitialImageKey 0x0000026aa629aef0 System :: Object^
  • errorImage 0x0000026aa629b110 {nativeImage = 2657511192608 RAWDATA = USERDATA =} System :: Drawing :: Изображение^ handleValid ложное логическое значение
  • изображение 0x0000026aa62a1fa0 {nativeImage = 2657511290992 RAWDATA = USERDATA =} Система: : Drawing :: изображение^ imageInstallationType ImageInstallationType :: DirectlySpecified ImageInstallationType imageLocation System :: String^
  • initialImage 0x0000026aa629c568 {nativeImage = 2657511196256 RAWDATA = USERDATA =} система :: Рисование :: изображение^
  • [System :: Drawing :: Bitmap ^] 0x0000026aa629c568 {} = DefaultTransparentColor :: Система рисования :: Растровые^
  • Система :: MarshalByRefObject^0x0000026aa629c568 {__identity =} Система :: MarshalByRefObject^ Флаги 73744 INT
  • FrameDimensionsList {длина = 1}^массив Высота 16 INT HorizontalResolution 96.000000 поплавок
  • RED >>>>>>> Palette 0x0000026aa629ea60 {флаги = 951278840 записи = {Length = 0}} система :: Рисование :: Imaging :: ColorPalette^
  • PhysicalDimension {ширина = 14,000000 высота = 16 ,000000} Система :: Рисование :: SizeF Система PixelFormat :: Рисование :: Изображения :: PixelFormat :: Format24bppRgb System :: Рисование :: Изображения :: PixelFormat PropertyIdList {Length = 0} array^ PropertyItems {Length = 0} массив^
  • RED >>>>>>> RawFormat 0x0000026aa629f900 {...} System :: Drawing :: визуализации :: ImageFormat^
  • Размер {Width = 14 Height = 16} система :: Рисование :: Размер Tag System :: Object^ VerticalResolution 96,000000 поплавок Ширина 14 ИНТ nativeImage 2657511196256 __int64 RAWDATA массив^ USERDATA System :: Object^ RED >>>>>>> Internals yncObject 0x0000026aa629d900 System :: Object^ loadCompletedDelegate System :: Threading :: SendOrPostCallback^ loadCompletedKey 0x0000026aa629af20 System :: Object^ loadProgressChangedKey 0x0000026aa629af38 System :: Object^ loadProgressDelegate System :: Threading :: SendOrPostCallback^ localImageStreamReader System :: IO: : StreamReader^
  • pictureBoxState {данных = 12} Системные :: Подборки :: Специализированный :: BitVector32 readBlockSize 4096 INT ReadBuffer массив^
  • savedSize {Width = 640 Height = 480} System :: Рисование :: Размер sizeMode System :: Windows :: Forms :: PictureBoxSizeMode :: Нормальная система :: Окна :: Forms :: PictureBoxSizeMode tempDownloadStream System :: IO :: MemoryStream^ totalBytesRead 0 INT uriImageStream System :: IO :: Поток^
+0

Поскольку я не вижу синхронизации, я предполагаю, что 'opencv_gui :: video_cap' запускается в основном потоке графического интерфейса. Таким образом, видя бесконечный цикл, уже есть признак потенциальных проблем. В то время как 'waitKey' может работать как-то вроде, я бы не полагался на это ни на что иное, кроме OpenCV UI. В любом случае это довольно неудобный дизайн в графическом приложении. Вы уже подождали между кадрами, так почему бы не использовать таймер? –

+0

Спасибо Dan за комментарий, я намерен быстро очистить код относительно цикла, но удаление цикла и захвата вручную по-прежнему не отображает фреймы на окне изображения, что является моей главной проблемой. –

+0

Можете ли вы попытаться выполнить эту функцию в отладчике? Каковы значения 'cvImage.cols, cvImage.rows, cvImage.step'? Имеет ли 'cvImage.data' какие-то разумные значения? BTW, изображения OpenCV являются BGR, и вы интерпретируете данные как RGB. Вам, вероятно, понадобится 'cvtColor', чтобы переключить его. –

ответ

0

Если бы отредактировать мой код немного, но я довольно много решил мой выпуск с использованием ответа, приведенного здесь: https://stackoverflow.com/a/12628861/5728859