Jump to content
Compvision.ru
virt

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

Recommended Posts

Попробовал вывести Mat на PictureBox через Image, как расписал Nicola. Использую Windows Forms через CLR.

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

				 this->pictureBox1->Image = nullptr;

				 cv::Mat frame;

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

				 if( !frame.empty() ) 

				 {

				 Image ^img = gcnew Bitmap(frame.cols, frame.rows, frame.step, PixelFormat::Format24bppRgb, IntPtr(frame.data));

				 this->pictureBox1->Image = img;

				 }

Все отлично, но почему-то во frame не считывается изображение из файла, соответственно вывода на PictureBox нет. В чем может быть трабла?

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

В форму)

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

Smorodov

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Написал подобный код, всё-таки с использованием таймера :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();

		 }


...


Share this post


Link to post
Share on other sites

char c = cvWaitKey(33);

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

  • Like 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Решил проблемму с закрытием процесса, но по-моему как то по извращенски :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();

		 }



Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

Share this post


Link to post
Share on other sites

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

Подскажите как это реализовать? Без таймера используя 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, но это тут непринципиально, просто хочу понять принцип как в отдельном потоке сделать

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.

×