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

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

Recommended Posts

cv::WaitKey нужон, т.к. именно в этой функции происходит обработка сообщений окна, а соответственно и вывод.

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


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

cv::WaitKey нужон, т.к. именно в этой функции происходит обработка сообщений окна, а соответственно и вывод.

Зачем здесь WaitKey, вывод ведь на форму осуществляется? Да и до этого не доходит, изображение считать не получается во frame.

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


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

Может так сработает?:

frame = cv::imread("C:\\1.bmp",-1);

Значения для параметра flags:

>0 загружается трехканальное цветное изображение

=0 загружается изображение в серых тонах

<0 загружается "как есть".

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


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

Здравствуйте, столкнулся с проблемой. Как сделать так, что бы вывести изображение с камеры в оконом (не MFC/консольное) приложении? То есть сейчас у меня консольное и создается для каждой камеры новое окно. Спасибо.

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


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

Куда вывести-то?

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


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

Куда вывести-то?

В форму)

Кажется я догадался что как почитав ни много форум.

Smorodov

Спасибо за перенос.

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


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

кто знает какой параметр преобразования использовать в ф-ии Image ^img = gcnew Bitmap(frame.cols, frame.rows, frame.step, PixelFormat::Format24bppRgb, IntPtr(frame.data));

а именно PixelFormat для CV_8U? пробовал PixelFormat::Format8bppIndexed, но израбоажение какое-то испорченное, но в принципе показывается. может его нужно как-то преобразовать?

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


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

Пост №7 из это темы не подходит?

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


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

Пост №7 из это темы не подходит?

да в другом косяк был, забыл делать сглаживание :rolleyes:

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


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

Здравствуйте! Можете объяснить как для визуализации кадров полученых с камеры использовать Tick таймера? Никола написал в посте, что его использует.

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


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

Это читали?

Ссылка на MSDN.

Там есть ссылка на пример.

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


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

Здравствуйте! Можете объяснить как для визуализации кадров полученых с камеры использовать Tick таймера? Никола написал в посте, что его использует.

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

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


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

Согласен, что отдельный поток лучше.

ЗЫ: есть еще мультимедиа таймер. У него приоритет повыше и точность до 1 мс. Но можно хорошо систему подвесить при неаккуратном использовании.

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


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

Спасибо, попробую реализовать потоками. А так сам пытался сделать используя этот пример MSDN

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


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

Написал подобный код, всё-таки с использованием таймера :rolleyes: , пока что эксперементирую)В результате вроде все работает нормально, НО при закрытии формы (клик по баттон2) процесс остается висеть в диспетчере задач. Я так понял, что CvCapture не удаляется и не отпускает программу? Или в чем то другом косячу? Также при попытке вызывать cvReleasecapture(&capture) возникает ошибка. Еще заметил, что со временем, пусть медленно н оверно, начинает расти объем памяти занимаемы процессом. Помогите пожалуйста)



...

private:

	CvCapture *capture;

	IplImage *frame;


...


private: System::Void timer1_Tick(System::Object^  sender, System::EventArgs^  e) {

// получаем кадр


    frame = 0;

    frame = cvQueryFrame( capture );


	// Копирование IplImage в объект .NET типа Image

	Image ^image = gcnew Bitmap(frame->width, frame->height,frame->widthStep,

	PixelFormat::Format24bppRgb, IntPtr(frame->imageData));


	// показываем

        this->pictureBox1->Image = image;


        char c = cvWaitKey(33);

        if (c == 27) 

	{ 

	// нажата ESC

                        timer1->Stop();

                }


}

...


private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {


			timer1->Stop();

		        //cvReleaseCapture(&capture);  // <----- ошибка

		 	this->Close();

		 }


...


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


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

char c = cvWaitKey(33);

А таймер на какой интервал?

Я обычно делаю так:

1. Ставлю таймер (one shot).

2. В калбэке его останавливаю.

3. Выполняю все что нужно.

4. Запускаю следующий интервал.

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


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

Т.е. char c = cvWaitKey(33); держит процесс?? Таймер на интервал 50 мс. А что насчет cvReleaseCapture? Почему вылезает ошибка на несоотвествие типов? И насчет роста занимаемого объема памяти можете что-нибудь посоветовать? А то напрягает очень, здесь на форуме находил про утечки памяти, но здесь похоже что то другое. За раннее спасибо!

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


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

capture сделайте static - ом.

По поводу утечки не знаю, ибо в clr я слаб.

Мне не нравится это:

Image ^image = gcnew Bitmap(frame->width, frame->height,frame->widthStep,
PixelFormat::Format24bppRgb, IntPtr(frame->imageData));[/code]

я привык к каждому new видеть delete, но вроде это само выгребаеться должно.

  • Like 1

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


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

На самом деле пробовал я удалять с помощью delete image, всё равно растет. Единственно что утешает, это что память занимается очень медленно, иногда чуток убывает. Но все равно спасибо вам)

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


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

Чет всё равно не удается закрыть процесс( Что еще можно сделать? Что именно с cvWaitKey() проделать? И зачем делать capture статиком?

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


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

Решил проблемму с закрытием процесса, но по-моему как то по извращенски :unsure: просто переопределив переменную в обработчике закрытия формы. Потому что static у CvCapture *capture, ничего не изменил и не устранил ошибку с cvReleaseCapture:



private: System::Void button2_Click(System::Object^  sender, System::EventArgs^  e) {


				 CvCapture *capture;


				 // Переопределяем capture и удаляем этот объект

			         timer1->Stop();


				 capture = cvCreateCameraCapture(CV_CAP_ANY);

				 cvReleaseCapture(&capture);

				 this->Close();

		 }



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


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

Здравствуйте! Никак не могу подключить openCV 2.3.1 к VC++. Подключил dll-ки как в посте №7. Библиотеки #include <opencv/cv.h>

#include <opencv/highgui.h>. Приложение Windows Forms. Что бы я не делал выдает ошибки на какой-то cvRound (10 ошибок). Код и форма пустые...

Помогите, пожалуйста.

Ах да, компилятор Visual C++ 2008

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


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

Прошу прощения, вопрос решил)

Забыл изменить:

General/Common Language Runtime Support: Common Language Runtime Support (/clr)

До этого стоял:

CLR-поддержка чистого MSIL (/clr:pure)

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


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

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

Подскажите как это реализовать? Без таймера используя OpenCV как сделать захват кадров? WaitKey не предлагать.

Есть такой код: (Вариант 1)


        private void button6_Click(object sender, EventArgs e)

        {

            CvCapture capture = CvCapture.FromCamera(0);

            CvWindow windowCapture = new CvWindow("SampleCapture");


            while (CvWindow.WaitKey(33) < 0)

            {

                pictureBox1.Image = capture.QueryFrame().ToBitmap();

            }

        }  

Изображение выводится на форму но и окно появляется ненужное. И изображение чуть дерганое. Изменяем код на такой: (Вариант 2)

        private void button6_Click(object sender, EventArgs e)

        {

            CvCapture capture = CvCapture.FromCamera(0);

            //CvWindow windowCapture = new CvWindow("SampleCapture");


            while (CvWindow.WaitKey(33) < 0)

            {

                pictureBox1.Image = capture.QueryFrame().ToBitmap();

                pictureBox1.Refresh();

            }

        } 

Изображение вроде как плавнее становится, но и проц программа сильнее юзает, ибо pictureBox1.Refresh() в цикле видимо не есть хорошо, к тому же окно с программой перестает реагировать на события от мышки, тоесть сделать с ним ничего нельзя. Вариант с таймером:

        CvCapture capture;


        private void button6_Click(object sender, EventArgs e)

        {

            capture = CvCapture.FromCamera(0);

            timer1.Start();

        }


        private void timer1_Tick(object sender, EventArgs e)

        {

            pictureBox1.Image = capture.QueryFrame().ToBitmap();

        }  

Изображение так же чуть дерганое как в первом варианте.

А как сделать отдельный поток? Или в отдельном потоке будет свой таймер?

Использую OpenCVSharp, но это тут непринципиально, просто хочу понять принцип как в отдельном потоке сделать

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


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

Пост №9 смотрели?

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×