Привет, поэтому я использовал 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 :: Поток^
Поскольку я не вижу синхронизации, я предполагаю, что 'opencv_gui :: video_cap' запускается в основном потоке графического интерфейса. Таким образом, видя бесконечный цикл, уже есть признак потенциальных проблем. В то время как 'waitKey' может работать как-то вроде, я бы не полагался на это ни на что иное, кроме OpenCV UI. В любом случае это довольно неудобный дизайн в графическом приложении. Вы уже подождали между кадрами, так почему бы не использовать таймер? –
Спасибо Dan за комментарий, я намерен быстро очистить код относительно цикла, но удаление цикла и захвата вручную по-прежнему не отображает фреймы на окне изображения, что является моей главной проблемой. –
Можете ли вы попытаться выполнить эту функцию в отладчике? Каковы значения 'cvImage.cols, cvImage.rows, cvImage.step'? Имеет ли 'cvImage.data' какие-то разумные значения? BTW, изображения OpenCV являются BGR, и вы интерпретируете данные как RGB. Вам, вероятно, понадобится 'cvtColor', чтобы переключить его. –