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

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

Recommended Posts

Flame    1

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

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

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


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

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

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


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

Smorodov, прошу прощения, не прочитал что там у вас реализация в отдельном потоке, сейчас буду разбираться, спасибо вам!

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


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

А каким образом можно в clr-проекте сделать кнопку, при нажатии на которую бы вызывались все функции, написанные не под win forms?

Например, button:

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


			 cv::Mat frame2 = cv::imread("1.bmp",1);

			 cv::namedWindow("My Window", CV_WINDOW_AUTOSIZE);

			 cv::imshow("My Window",frame2);


		 }

Появляется окно созданное, и тут же возникает ошибка. "External component has thrown an exception."

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


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

Здравствуйте! Помогите пожалуйста разобраться. При использовании функции cvCvtColor() картинка в pictureBox1 начинает троиться, когда убираю её и получаю кадр напрямую из видео потока то все хорошо! Заметил что после функции cvCvtColor

меняется формат пикселей с RGB на GRAV может дело в этом?

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

			 {


         if (VI.isFrameNew(device1)){

	 VI.getPixels(device1, (unsigned char *)frame->imageData, true, true); // получение пикселей в RGB

	  dst=cvCreateImage( cvGetSize(frame), IPL_DEPTH_8U, 1 );

	   cvCvtColor(frame, dst, CV_RGB2GRAY);//Полутон


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

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


		 this->pictureBox1->Image = image;


				    };

			 }

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


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

Очевидно, что для серой картинки PixelFormat::Format24bppRgb не подходит. Нет?

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


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

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

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


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

Конечно знает! Надо ставить в однозначно соответствие PixelFormat и цветовое пространство изображения. Если не получается, то проводить промежуточную конвертацию.

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


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

Формат преобразовал с помощью Format8bppIndexed. Кадры перестали троица, но как GRAV привести к RGB? это нужно обрабатывать каждый пиксель GRAV и записывать в каналы RGB. Или можно как нибудь попроще сделать?

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


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

Неясна постановка задачи. Если надо выводить именно преобразованный кадр, а он серый, то цветным его уже не сделать. Или надо просто сконвертировать его в RGB? Тогда вызови ту же cvCvtColor. Или что-то другое?

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


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

Нужно просто вывести полутоновое изображение в pictureBox1, преобразовать в полутон желательно с помощью стандартных функций OpenCV. Сконвертировать в RGB с помощью cvCvtColor я не знаю как(, и возможно ли это вообще?

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


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

В принципе вопрос снят. Так как при переводе изображения в монохромное(а мне с таким и нужно работать) в pictureBox выводится адекватная картинка. Но все же интересно как в pictureBox отобразить полутон если не совпадает цветовая палитра. Неужели нужно приводить к битмапу и там менять каждый пиксель RGB.

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


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

Ну да, по-другому не получится.

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


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

таким образом ничего не выходит:

this->pictureBox1->Image = gcnew Bitmap(frame->cols, frame->rows, frame->step, PixelFormat::Format24bppRgb, IntPtr(frame->data));

изображение не выводится - черный экран. и в выложеенном примере (VideoOnForm.zip) тоже самое. в чем беда?

выложите алгоритм преобразования Сv::Mat to Drawing::Bitmap!

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


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

код:


private:

			cv::VideoCapture *capture;

			cv::Mat frame;

			int k;


			System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 

			 {

				pictureBox1->Image = nullptr;


				if( capture->isOpened() )

					capture->release();


				if(!capture->open(0))

				{

					MessageBox::Show("Cannot open WebCam");

					return;

				}	 


				int fps = (int)capture->get(CV_CAP_PROP_FPS); 


				if(fps == 0)

					 fps = 24;


				timer1->Interval = 1000/fps;

				timer1->Start();  

			 }


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

			{


cv::Mat frame;				

capture->read(frame);


				if(frame.empty())

				{

					this->pictureBox1->Image = nullptr;

					return;

				}


				this->pictureBox1->Image = gcnew Bitmap(frame.cols, frame.rows, frame.step, PixelFormat::Format24bppRgb, IntPtr(frame.data));


				frame.release();

			}

  • Like 1

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


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

Здравствуйте. При попытке компиляции любого проекта с Windows Forms, к которому подключена OpenCV (даже просто содержащего стандартную форму, и все), MSVS виснет глубоко и надолго. Причем компиляция, видимо, проходит успешно и создается рабочий exe-шник. Студия при этом находится в статусе (Выполнение) и пишет "Загрузка символов для d:\Forms\Forms\Debug\Forms.exe"

С чем это может быть связано и, главное, как с этим бороться? MSVS 2008, OpenCV 2.3.1

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


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

А если просто построить (Build).

А после этого запускать получившийся екзешник из Windows (не из IDE)?

Он запустится?

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


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

Побросайте, .dll и .pdb к exe-шнику, установите рабочую директорию на директорию с exe-шником.

Должно работать, скорее всего студия не может найти файлы с отладочной информацией (.pdb) библиотек.

Правда не уверен поможет или нет, у меня такой проблемы не было.

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


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

Подскажите плиз что необходимо дописать чтобы форма закрывалась, при нажатии на крестик форма не закрывается

cv::Mat pic;

cv::VideoCapture cap("rtsp://192.168.0.112/vis");

cv::namedWindow("Video",0);

if(!cap.isOpened())

{

cout << "Error";

return 0xDEAD;

}

while (cv::waitKey(10) == -1)

{

cap >> pic;

cv::imshow("Video",pic);

}

return 0;

и еще при просмотре видео с камеры нижняя часть видео плывет, что может быть?

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


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

Если включить обычную веб камеру то видео показывает нормально, ip камеру через rtsp://192.168.0.112/vis то нижняя часть примерно 5 часть от всего видео начинает плыть и дергаться.

Если данную камеру просмотреть через VLC media player то показывает чуть потторможено но ничего не плывет

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


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

Скорее всего это надо смотреть ffmpeg, opencv через нее работает с IP камерами.

Можно попробовать еще задать адрес в виде rtsp://192.168.0.112/vis?.mjpg ,задав таким образом формат потока.

ЗЫ: У меня таких проблем с IP-шками не наблюдалось.

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


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

Подскажите плиз как в С++ изменить размер окна и сделать его поверх всех окон?

нашел функцию SetWindowPos(window, HWND_TOP, 0, 0, 0, 0,SWP_NOMOVE | SWP_NOSIZE);

пишет что SetWindowPos: идентификатор не найден

как подключить библиотеку user32 к своей программе чтобы такой ошибки не было?

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


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

надо подключить заголовочник windows.h

Здесь все написано

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×