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

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

Recommended Posts

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

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


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

А каким образом можно в 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;


				    };

			 }

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


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

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

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


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

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

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


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

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

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


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

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

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


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

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

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


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

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

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


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

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

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


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

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

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


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

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

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

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

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

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


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

код:


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

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


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

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

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

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


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

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

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

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

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


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

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

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

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

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


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

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

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;

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

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


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

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

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

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


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

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

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

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

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


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

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

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

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

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

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


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

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

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

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


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

Пытаюсь вывести изображение вот таким вот образом:

// получаем следующий кадр

frame = cvQueryFrame( capture );

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

pictureBox1->Image = gcnew System::Drawing::Bitmap( frame->width,frame->height,frame->widthStep,System::Drawing::Imaging::PixelFormat::Undefined, ( System::IntPtr ) frame-> imageData);

Но возникает ошибка: Необработанное исключение типа "System.NullReferenceException"

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×