Перейти к содержимому
Compvision.ru
virt

Вывод видео на форму в visual studio 2008 - 2010

Recommended Posts

L@MER    6

Есть подозрение что камера не поддерживается. 

Попробуйте считать изображение из файла и вывести его.

 

Как ни странно да. Хотя при создании консольного проложения с той-же opencv3.0 эта usb-камера открывалась. Подцепил другую - видит!

Но при этом появилось две странности.

 

Первая:работает программа и на форме формируется картинка, далее я открываю какое-нибуть окно, программу или диспетчер задач, как программа моя перестает работать и выводится ошибка:

 

post-1271-0-89187300-1427227531_thumb.jp

 

Вторая ерунда:при закрытии программы вылетает ошибка:

 

post-1271-0-62758500-1427227526_thumb.jp

 

В компиляторе при отладке (после ошибки при закрытии программы) пишет:

 

Поток 0xd38 завершился с кодом 0 (0x0).

Программа "[1540] CVPROF.exe" завершилась с кодом 2 (0x2).

 

Я почитал, народ пишет что такая ошибка может возникать если программу под пользователем с ограниченными правами запускаешь. ПРобовал под Администратором - таже петрушка.

 

Если начинаю отлаживать в целом весь проект, то выдает такое сообщение:

 

post-1271-0-19069900-1427228271_thumb.jp

 

Походу ругается на строку кода, где IPlImage....

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Smorodov    523

width и height проверьте, небось отрицательные или нулевые, или еще ерунда какая нибудь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
L@MER    6

width и height проверьте, небось отрицательные или нулевые, или еще ерунда какая нибудь.

 

Ага, это я уже нашел. Закомментировал часть кода. Присвоил значения - константы. Все прекрасно заработало.

 

Вот кусок кода:

void DrawData(IplImage*_frame, CDC*dc)
{
	// RECT r; // Структура RECT содержит координаты четырех углов прямоугольника
	// dc->GetClipBox(&r); //GetClipBox-cчитывает огpаничивающий пpямоугольник вокpуг текущей области выpезания, r - принимающая структура типа RECT
	// int width = r.right - r.left;
	// int height = r.bottom - r.top;
	int width = 400;
	int height = 300;
	IplImage *img = cvCreateImage(cvSize(width, height), _frame->depth, _frame->nChannels);
	cvResize(_frame, img);

Как показывает отладка в структуре r:

r.right =0, r.left=0, r.bottom=0, r.top=0

Т.е. dc->GetClipBox(&r) не работает, хотя прописывал Wingdi.h (include Windows.h), подключал напрямую lib c Gdi32.lib. И Gdi32.dll в системе присутствует.

Ну и шут с ним, это не критично, главное вывод в Picture Control состоялся! Теперь дело пойдет!

Да, немного понаблюдал, утечек памяти в диспетчере задач замечено не было...

 

P.S. Тему можно переименовывать с Вывод видео на форму в visual studio 2008 - 2010 в Вывод видео на форму в visual studio 2008 - 2013

В общем предложенный в методичке способ с небольшой корректировкой пошел на MSVS2013 на Windows7 64bit.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Goldz    0

Всем мое почтение

Много лет пишу на С для Arduino, а там форм нет. Дурная голова решила создать устройство, которое должно сверлить отверстие в определенном месте, но прежде это место надо найти

Решил попробовать OpenCV + VS2010 C++.......

Но все это прелюдия

Теперь крик души!!!!!!!

Помогите

Есть код из Инета 

Создал консольное приложение, добавил main.cpp 

#include <opencv\cv.h>
#include <opencv\highgui.h>


using namespace cv;



int main()
{
Mat image;
VideoCapture cap;
cap.open(0);
namedWindow("window",1);
while(1)
{
cap>>image;
imshow("window",image);
waitKey(33);

}


	return 0;
}

Все отлично работает

Но как сделать вывод в окно на форме

Я прочитал всю ветку, ну туп...

 

Если кто решит мне помочь, прошу втолковать с самого начала

 Создал проект Windows Forms Application, что делать дальше что бы при исполнении появилось видео с видеокамеры USB в окне на форме

 

Буду много благодарен

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
fotomer    11

 Windows Forms Application это же managet NET. Для OpenCV лучше писать в native. Непосредственно в студии проект С++ -> MFC. Но создание интерфейса в MFC довольно муторное дело, я бы рекомендовал QT. У себя в частности делаю интерфейс на QT, дебажу и пишу код в студии (у студии есть плагин для работы с QT). В самой QT бросается на форму объект QGraphicsView и делее в нем отображаются все элементы.

Объявления в классе

QGraphicsScene *scene;
QImage *img;
QPixmap *pixmap;
QGraphicsPixmapItem *pPixmapItem;

 

Тело функции для отрисовки.

Mat imagem = cv::imread("DSC_0779.JPG");     
img = new QImage((const unsigned char*)(imagem.data), imagem.colsimagem.rowsimagem.step/*QImage::Format_RGB16*/QImage::Format_Indexed8);
pixmap = new QPixmap(QPixmap::fromImage(*img));

pPixmapItem = scene->addPixmap(*pixmap);
ui->gView->fitInView((QGraphicsItem*)pPixmapItemQt::KeepAspectRatio);

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Goldz    0

Еще вопрос

В каком файле проекта и как нужно объявить функцию чтобы ее было видно из любой точки программы

Я в основном cpp сделал так - rem

// ff22.cpp : main project file.

#include "stdafx.h"
#include "Form1.h"
void rem();
using namespace ff22;

[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
	// Enabling Windows XP visual effects before any controls are created
	Application::EnableVisualStyles();
	Application::SetCompatibleTextRenderingDefault(false); 

	// Create the main window and run it
	Application::Run(gcnew Form1());
	return 0;
}
void rem()
{
/////////исполняемый код
}

Пытаюсь вызвать с формы кнопкой, дает ошибку при сборке

d:\opencv\ff22\ff22\Form1.h(80): error C3861: 'rem': identifier not found

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
fotomer    11

Еще вопрос

В каком файле проекта и как нужно объявить функцию чтобы ее было видно из любой точки программы

 

 

В stdafx.h указывается. 

 

З.Ы. В следующих версиях студии после 2010 прекращена поддержка форм в managed C++, только Console и Class Library.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Goldz    0

Написал в  stdafx.h

void df(void)
{
	//
}
 

По кнопке на форме вызываю  df();

Компилятор говорит:

1>stdafx.obj : error LNK2005: "void __clrcall df(void)" (?df@@$$FYMXXZ) already defined in newsForm.obj
В newsForm.cpp упоминаний о df нет
 
Направьте на путь истинный !!!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Smorodov    523

Так низзя !

 

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

 

Задайте в заголовке предварительное объявление.

Типа:

void df(void);

а в каком нибудь .cpp файле задайте саму функцию.

Этот .CPP прицепите к проекту -> enjoy :)

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
fotomer    11

Компилятор говорит:

1>stdafx.obj : error LNK2005: "void __clrcall df(void)" (?df@@$$FYMXXZ) already defined in newsForm.obj
В newsForm.cpp упоминаний о df нет

В stdafx.h указать определение функции, в stdafx.cpp тело функции.

 

З.Ы. А чем обусловлен выбор managed C++? Там придется работать с OpenCV через всякие обертки, что не совсем удобно. http://robocraft.ru/blog/computervision/575.html

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Goldz    0

Всем спасибо!!!!

Промучался три дня, но дело сдвинулось с мертвой точки

Вывести видео в окно на форме не получилось, да и мне оно вообще то это не нужно

Пошел по другому пути. Создается приложение с формой, а из нее запускается вывод видео в отдельное окно

Такая схема позволяет как управлять окном вывода(размер, вид и т.д.), так и передавать данные из окна на форму

Выкладываю код, может кому пригодится(три дня экономии)MainOCV.rar

 

Осталось организовать поиск объекта по образцу и определение относительных координат объекта

 

Может быть кто решал такие проблемы, поделитесь наработками

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
And36    0

Уважаемые форумчане, прошу понять и простить за слабую компетенцию в VS10+OpenCV231 в частности и в программировании С++ в целом.

Есть рабочий алгоритм обработки видео в реальном масштабе времени построенный в Матлабе. Хочу реализовать его с помощью С++. Исходя из тех рекомендаций, которые нашел в интернете, остановился на VS10+OpenCV231 (Win7x64). Хочу получить exe-файл, который открывает форму в которой 1 кнопка "старт" запускает захват видео с веб-камеры и реализует алгоритм обработки видео.

Долгим и тернистым был путь выбора версий VS+OpenCV, т.к. оказалось, что OpenCV231 нормально стыкуется только с VS10 или 9 (а узнаешь об этом только после долгих инсинуаций  по установке))))

Все-таки мне удалось связать все и прописать все пути для библиотек. Нашел подходящие примеры и запустил свое первое приложение (через пустой проект) - к счастью оно заработало.  Видео открывается в отдельном окне, окно можно свернуть и переместить, и при нажатии esc все закрывается нормально.

Но при попытке вывести видео на форму, т.е. чтобы при запуске программы выводилось только одно окно с кнопкой "старт" и при ее нажатии в том же окне открывалось видео, возникла одна проблема - форма открывается и пока не нажата кнопка "старт" форму можно перемещать, сворачивать и двигать, как только нажимаю "старт" нормально выводится видео в этой форме, но форма "застывает" на месте и больше с ней ничего нельзя сделать, ни на какие команды не реагирует, комп не висит, все остальное работает нормально, форму можно закрыть только из VS нажав на "стоп" отладки. Основной код ниже.

Скрытый текст

 

...

#include <cv.h>
#include <highgui.h>
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"

...

#pragma endregion
    private: System::Void Form1_Load(System::Object^  sender, System::EventArgs^  e) {
             }
    private: System::Void startmes_Click(System::Object^  sender, System::EventArgs^  e) {

 // получаем любую подключённую камеру
        CvCapture* capture = cvCreateCameraCapture(CV_CAP_ANY); 
        assert(capture!=0);
        
        IplImage* frame=0;
        
        while(true){
                // получаем кадр
                frame = cvQueryFrame( capture );
            
                // показываем в форме кадр 
                pictureBox1->Image  = gcnew System::Drawing::Bitmap
(frame->width,frame->height,frame->widthStep,
System::Drawing::Imaging::PixelFormat::Format24bppRgb,(System::IntPtr) frame->imageData);
pictureBox1->Refresh(); 

                     char c = cvWaitKey(33);
                if (c == 27) { // если нажата ESC - выходим
                        break;
                             }
                }
     
        // освобождаем ресурсы
        cvReleaseCapture(&capture);
        cvDestroyWindow("capture");
     }
    private: System::Void pictureBox1_Click(System::Object^  sender, System::EventArgs^  e) {


             }
    };
}

 

буду бесконечно признателен за любую помощь

может нужно как-то изменить версию Framework?

игра с параметрами cvWaitKey не помогла - никакой реакции формы

 

из всего списка ошибок подозрительным выглядит только это

...

"WCWF.exe": Загружено: "C:\Windows\SysWOW64\odbc32.dll", Невозможно найти или открыть файл PDB
"WCWF.exe": Загружено: "C:\Windows\SysWOW64\odbcint.dll", Двоичный код не был построен с отладочной информацией.
Поток 'Поток Win32' (0x50c) завершился с кодом 0 (0x0).
"WCWF.exe": Загружено: "C:\Windows\SysWOW64\qedit.dll", Невозможно найти или открыть файл PDB

...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
iskees    24

Все прелести плюсов. Может вам C# попробовать или яву, проивзодительность +- та же, все функции называются примерно также как  в с++ , но для не знатоков плюсов все намного проще.

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
fotomer    11
10 час назад, And36 said:

Есть рабочий алгоритм обработки видео в реальном масштабе времени построенный в Матлабе. Хочу реализовать его с помощью С++. Исходя из тех рекомендаций, которые нашел в интернете, остановился на VS10+OpenCV231 (Win7x64). может нужно как-то изменить версию Framework?

У вас же код на managed C++, типа C#, только синтаксис другой. Попробйте на обычном С++. Если делаете все сначала, имхо сразу надо ставить VS13 или 15 и OpenCV 3.1. 

Если будете удалять VS2010, лучше делать через эту утилиту https://blogs.msdn.microsoft.com/heaths/2010/08/23/visual-studio-2010-uninstall-utility/

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
And36    0

Спасибо ISKEES и FOTOMER за идеи.

Если,можно,то в двух словах:

1.Чем для слабых игроков лучше java или C# с точки зрения минимальных затрат времени разработчика для реализации алгоритмов обработки видео в реальном масштабе времени? Встречал некоторые ресурсы,где пишут, что java на порядок медленнее работает в рамках указанной задачи.

2. Какие преимущества мне даст переустановка VS и OpenCV,по сравнению с тем что уже стоит? Не в форме у меня все пока работает, а в форме не хочет завершать программу,но видео захватывает вроде нормально. VS13 или 15 и OpenCV 3.1 позволят легче решить мою задачу? (не очень понимаю, что значит managed C++,что бывает разный?,управляемый и неуправляемый?)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
iskees    24

Тестировал оба С# врапера и явоский(но его давно), на одном железе и разница в сравнении с с++ была минимальная. Разумеется если вы используете функции opencv, а не начинаете работать напрямую с пикселями. А плюс в том что с# на порядок проще плюсов со всеми этими его хедерами, линковками .... Качаете дллки,  копируете в папку проекта, подключаете пару из них к проекту и все работает без компиляций и прочих танцев с бубном. 

  • Like 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
And36    0

ISKEES, спасибо большое, проверю вариант с С# и доложу об успехах)))

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
roma7777777    0

Помогите кто может!) Скачал выложенный исходник  VideoOnForm! Видео выводится, но не всё а только часть...т е на экране приложения видна только небольшая часть всего изображения...как сделать, чтобы на форму вписывалось всё изображение? может каким нибудь resize? и где надо внести изменения? Спасибо!

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Помогите кто может!) Скачал выложенный исходник  VideoOnForm! Видео не открывается и не выводится, с камерой та же ситуация... VS2013, opencv 2.4.9... При нажатии на кнопку открыть файл или камеру вываливается вот такая ошибка

Снимок.PNG

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×