Jump to content
Compvision.ru
virt

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

Recommended Posts

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

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

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

Много лет пишу на С для 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 в окне на форме

 

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

Share this post


Link to post
Share on other sites

 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

Share this post


Link to post
Share on other sites

Еще вопрос

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

Я в основном 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

Share this post


Link to post
Share on other sites

Еще вопрос

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

 

 

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

 

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

  • Like 1

Share this post


Link to post
Share on other sites

Написал в  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 нет
 
Направьте на путь истинный !!!

Share this post


Link to post
Share on other sites

Так низзя !

 

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

 

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

Типа:

void df(void);

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

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

  • Like 1

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

 

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

 

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

 

Share this post


Link to post
Share on other sites

Уважаемые форумчане, прошу понять и простить за слабую компетенцию в 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

...

Share this post


Link to post
Share on other sites

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

  • Like 1

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

  • Like 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Снимок.PNG

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×