Jump to content
Compvision.ru
virt

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

Recommended Posts

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

Здравствуйте! Помогите пожалуйста разобраться. При использовании функции 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;


				    };

			 }

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

код:


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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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;

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

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

Share this post


Link to post
Share on other sites

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

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

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

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

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.

×