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

OpenCV с windows forms

Recommended Posts

Всем привет! Попробовал создать в visual studio 2008 простое приложение CLR с виндовой формой. По нажатию кнопки на форме, выполняется код из примера в книги с чтением видео из файла и отображением в окне. Видео отображается в окне, созданным opencv. Скомпилировал без ошибок, но после того, как отображается первый кадр, программа вылетает с сообщением о необработанном исключении и ошибке с памятью. Кто с этим сталкивался и в каком направлении двигаться? В интернете много искал уже, пробовал некоторые советы - не помогло.

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


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

Всем привет! Попробовал создать в visual studio 2008 простое приложение CLR с виндовой формой. По нажатию кнопки на форме, выполняется код из примера в книги с чтением видео из файла и отображением в окне. Видео отображается в окне, созданным opencv. Скомпилировал без ошибок, но после того, как отображается первый кадр, программа вылетает с сообщением о необработанном исключении и ошибке с памятью. Кто с этим сталкивался и в каком направлении двигаться? В интернете много искал уже, пробовал некоторые советы - не помогло.

А код и скрин с ошибками можно посмотреть ?

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


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


#pragma once


#include <highgui.h>


using namespace System::Runtime::InteropServices;


namespace test2 {


	using namespace System;

	using namespace System::ComponentModel;

	using namespace System::Collections;

	using namespace System::Windows::Forms;

	using namespace System::Data;

	using namespace System::Drawing;


	/// <summary>

	/// Сводка для Form1

	///

	/// Внимание! При изменении имени этого класса необходимо также изменить

	///          свойство имени файла ресурсов ("Resource File Name") для средства компиляции управляемого ресурса,

	///          связанного со всеми файлами с расширением .resx, от которых зависит данный класс. В противном случае,

	///          конструкторы не смогут правильно работать с локализованными

	///          ресурсами, сопоставленными данной форме.

	/// </summary>

	public ref class Form1 : public System::Windows::Forms::Form

	{

	public:

		Form1(void)

		{

			InitializeComponent();

			//

			//TODO: добавьте код конструктора

			//

		}


	protected:

		/// <summary>

		/// Освободить все используемые ресурсы.

		/// </summary>

		~Form1()

		{

			if (components)

			{

				delete components;

			}

		}

	private: System::Windows::Forms::Button^  button1;

	private: System::Windows::Forms::OpenFileDialog^  openFileDialog1;

	protected: 


	private:

		/// <summary>

		/// Требуется переменная конструктора.

		/// </summary>

		System::ComponentModel::Container ^components;


#pragma region Windows Form Designer generated code

		/// <summary>

		/// Обязательный метод для поддержки конструктора - не изменяйте

		/// содержимое данного метода при помощи редактора кода.

		/// </summary>

		void InitializeComponent(void)

		{

			this->button1 = (gcnew System::Windows::Forms::Button());

			this->openFileDialog1 = (gcnew System::Windows::Forms::OpenFileDialog());

			this->SuspendLayout();

			// 

			// button1

			// 

			this->button1->Location = System::Drawing::Point(66, 43);

			this->button1->Name = L"button1";

			this->button1->Size = System::Drawing::Size(75, 23);

			this->button1->TabIndex = 0;

			this->button1->Text = L"button1";

			this->button1->UseVisualStyleBackColor = true;

			this->button1->Click += gcnew System::EventHandler(this, &Form1::button1_Click);

			// 

			// openFileDialog1

			// 

			this->openFileDialog1->FileName = L"openFileDialog1";

			// 

			// Form1

			// 

			this->AutoScaleDimensions = System::Drawing::SizeF(6, 13);

			this->AutoScaleMode = System::Windows::Forms::AutoScaleMode::Font;

			this->ClientSize = System::Drawing::Size(284, 264);

			this->Controls->Add(this->button1);

			this->Name = L"Form1";

			this->Text = L"Form1";

			this->ResumeLayout(false);


		}

#pragma endregion

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

				 if(openFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK)

				 {

					 char* str2 = (char*)(void*)Marshal::StringToHGlobalAnsi(openFileDialog1->FileName);

					 cvNamedWindow( "AVI Video", CV_WINDOW_AUTOSIZE );

					 CvCapture* capture = cvCreateFileCapture(str2);

					 IplImage* frame;

					 while(1) 

					 {

						frame = cvQueryFrame( capture ); 

						if( !frame ) break;

						cvShowImage( "AVI Video", frame );

						char c = cvWaitKey(33);

						if( c == 27 ) break;

					 }

					 cvReleaseCapture( &capture );

					 cvDestroyWindow( "AVI Video" );

				 }

			 }

	};

}

Похоже проблема в видео файле оказалась, попробовал открыть другой и все нормально. При этом первую картинку из видео отображает, поэтому искал проблему в другом месте. И в других случаях файл проигрывался.

Сообщение следующее:

Необрабатываемое исключение в приложении. При нажатии кнопки "Продолжить" приложение проигнорирует ошибку и попытается продолжить работу. При нажатии кнопки "Выход" приложение немедленно завершит работу. Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена.

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


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

Добрый день!

Подскажите как запустить проект windows form совместно с opencv

Дело в том, что при создании консольного проекта, все работает, если же проект использует windows form, то он даже не компилируется.

Что я делал:

1) создал проект в VS2010 C++ Windows Form Application

2) в свойствах проекта прописал

Include dir

c:\OpenCV2.2\include\opencv

c:\OpenCV2.2\

Library dir

c:\OpenCV2.2\lib\

Linker->Input

opencv_core220d.lib;opencv_contrib220d.lib;opencv_features2d220d.lib;opencv_flann220d.lib;opencv_highgui220d.lib;opencv_objdetect220d.lib;opencv_video220d.lib;opencv_legacy220d.lib;opencv_calib3d220d.lib;opencv_ffmpeg220d.lib;opencv_imgproc220d.lib;opencv_ml220d.lib;%(AdditionalDependencies)

3) Попробовал скомпилировать, все ок, окно запустилось.

4) Добавил в код единственную строку #include <cv.h>, причем выбрал cv.h из предложенного выпадающего списка.

5) Нажал F5, выдало ошибки


Error	1	error C3862: 'cvRound': cannot compile an unmanaged function with /clr:pure or /clr:safe	c:\OpenCV2.2\include\opencv2\core\types_c.h	284	1	WFormsAndOCV

Error	2	error C3645: 'cvRound' : __clrcall cannot be used on functions compiled to native code	c:\OpenCV2.2\include\opencv2\core\types_c.h	284	1	WFormsAndOCV

Error	3	error C3862: 'CV_XADD': cannot compile an unmanaged function with /clr:pure or /clr:safe	c:\OpenCV2.2\include\opencv2\core\operations.hpp	78	1	WFormsAndOCV

Error	4	error C3645: 'CV_XADD' : __clrcall cannot be used on functions compiled to native code	c:\OpenCV2.2\include\opencv2\core\operations.hpp	78	1	WFormsAndOCV

Error	5	error C1189: #error :  ERROR: EMM intrinsics not supported in the pure mode!	C:\Program Files\Microsoft Visual Studio 10.0\VC\include\emmintrin.h	27	1	WFormsAndOCV

Все действия одинаковы для консольного проекта и проекта с формами.

Как все же запустить все это дело??

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


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

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


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

Делаю приложение с использованием OpenCV. Мне нужно узнать на каком пикселе пользователь щелкнул в окне показа видео.

Для этого привязываю обработчик событий к этому окну, пример http://robocraft.ru/blog/computervision/278.html

cvSetMouseCallback( "original", myMouseCallback, (void*) image);

В примере указанном по ссылке все работает, при нажатии на изображении в окне получаю координаты, но дело в том, что я не могу все это запустить при работе с формами. Окно opencv в котором все отображается запускается у меня так:

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

..

cvNamedWindow( "CAMERA",1);

cvSetMouseCallback( "CAMERA", ClickOnCVScreen, (void*) image);

..

}

private: System::Void ClickOnCVScreen(int event, int x, int y, int flags, void* param )

{

}

Вобщем все взято с примера указанного по ссылке.

Ошибка

error C3867: ocv_detect::Form1::ClickOnCVScreen: в вызове функции отсутствует список аргументов; используйте "&ocv_detect::Form1::ClickOnCVScreen" для создания указателя на член

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


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

Перемудрили :)

cvSetMouseCallback( "CAMERA", ClickOnCVScreen, (void*) image);
Вам не подходит (эта функция работает с другим прототипом функции обратного вызова) и не нужно. засуньте все в
private: System::Void ClickOnCVScreen(int event, int x, int y, int flags, void* param )

пересчитайте координаты и будет Вам счастье.

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


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

Вот мой код. Что толку если я все запишу в ClickOnCVScreen, она должна обрабатывать события мышки от окна opencv. Вот почему то не получается это сделать. Ошибка выскакивает в строке cvSetMouseCallback( "CAMERA", ClickOnCVScreen, (void*) image) и требует передачи параметров этой функции. В консольном же приложении этого не требуется и все запускается на ура.

	private: System::Void ClickOnCVScreen(int event, int x, int y, int flags, void* param )

			{

				IplImage* img = (IplImage*) param;

				switch( event )

				{

			          case CV_EVENT_MOUSEMOVE: 

				    break;

	                          case CV_EVENT_LBUTTONDOWN:

				    this->listBox1->Items->Add("X="+x.ToString()+" Y="+y.ToString());

                                    break;

	                          case CV_EVENT_LBUTTONUP:

                                    break;

				}

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

				listBox1->Items->Clear();

				capture = cvCreateCameraCapture(CV_CAP_ANY);

				cvNamedWindow( "CAMERA",1);

				cvSetMouseCallback( "CAMERA", ClickOnCVScreen, (void*) image);

				while ( true )

				{

					frame = cvQueryFrame( capture );

					cvShowImage( "CAMERA", frame );

					if(cvWaitKey(33) == 27)

						break;

					if(isBreak)

						break;

				}

				cvReleaseCapture( &capture );

				cvDestroyWindow("CAMERA");

				return;

			 }

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


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

А, ну да, в C# же нет указателей.

Ну так напишите как он просит: &ocv_detect::Form1::ClickOnCVScreen вместо ClickOnCVScreen. Я не спец по шарпу, но думаю это может помочь.

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


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

А, ну да, в C# же нет указателей.

Ну так напишите как он просит: &ocv_detect::Form1::ClickOnCVScreen вместо ClickOnCVScreen. Я не спец по шарпу, но думаю это может помочь.

Это C++, Visual Studio 2008, пробовал и так, но не получается.

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


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

а так, что пишет?

void onMouse( int event, int x, int y, int /*flags*/, void* /*param*/ )
{
if( event == CV_EVENT_LBUTTONDOWN )
{

}
}
...
setMouseCallback( "CAMERA", onMouse, 0 );
...
[/code]

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


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

cvSetMouseCallback( "CAMERA", &ocv_detect::Form1::onMouse, 0 );

error C3374: невозможно получить адрес "ocv_detect::Form1::onMouse", пока не будет создан экземпляр делегата


cvSetMouseCallback( "CAMERA", onMouse, 0 );

error C3867: ocv_detect::Form1::onMouse: в вызове функции отсутствует список аргументов; используйте "&ocv_detect::Form1::onMouse" для создания указателя на член

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


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

Вот тут есть исходник библиотеки: http://www.codeproject.com/KB/cs/Intel_OpenCV.aspx

поковыряйте, может найдете решение.

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


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

А, ну да, в C# же нет указателей.

...

В C# есть указатели, просто их надо использовать в unsafe-блоках и держать подальше от GC с помощью fixed

post-2854-0-90235200-1313588225_thumb.pn

Извините, если докопался невтему, просто решил защитить свой любимый язык :)

  • Like 1

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


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

Скажите пожалуйста ! Получилось ли избавиться от ошибки ? А то у меня такая же ситуация

cvSetMouseCallback( "CAMERA", onMouse, 0 );

error C3867: ocv_detect::Form1::onMouse: в вызове функции отсутствует список аргументов; используйте "&ocv_detect::Form1::onMouse" для создания указателя на член

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×