Gvision 0 Жалоба Опубликовано January 20, 2011 Всем привет! Попробовал создать в visual studio 2008 простое приложение CLR с виндовой формой. По нажатию кнопки на форме, выполняется код из примера в книги с чтением видео из файла и отображением в окне. Видео отображается в окне, созданным opencv. Скомпилировал без ошибок, но после того, как отображается первый кадр, программа вылетает с сообщением о необработанном исключении и ошибке с памятью. Кто с этим сталкивался и в каком направлении двигаться? В интернете много искал уже, пробовал некоторые советы - не помогло. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано January 20, 2011 Всем привет! Попробовал создать в visual studio 2008 простое приложение CLR с виндовой формой. По нажатию кнопки на форме, выполняется код из примера в книги с чтением видео из файла и отображением в окне. Видео отображается в окне, созданным opencv. Скомпилировал без ошибок, но после того, как отображается первый кадр, программа вылетает с сообщением о необработанном исключении и ошибке с памятью. Кто с этим сталкивался и в каком направлении двигаться? В интернете много искал уже, пробовал некоторые советы - не помогло. А код и скрин с ошибками можно посмотреть ? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Gvision 0 Жалоба Опубликовано January 21, 2011 #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" ); } } }; } Похоже проблема в видео файле оказалась, попробовал открыть другой и все нормально. При этом первую картинку из видео отображает, поэтому искал проблему в другом месте. И в других случаях файл проигрывался. Сообщение следующее: Необрабатываемое исключение в приложении. При нажатии кнопки "Продолжить" приложение проигнорирует ошибку и попытается продолжить работу. При нажатии кнопки "Выход" приложение немедленно завершит работу. Попытка чтения или записи в защищенную память. Это часто свидетельствует о том, что другая память повреждена. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ikambi 0 Жалоба Опубликовано July 30, 2011 Добрый день! Подскажите как запустить проект 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 Все действия одинаковы для консольного проекта и проекта с формами. Как все же запустить все это дело?? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано July 30, 2011 Тут есть пример: http://www.compvision.ru/forum/index.php?showtopic=434 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ikambi 0 Жалоба Опубликовано July 30, 2011 Тут есть пример: http://www.compvision.ru/forum/index.php?showtopic=434 Спасибо!!! То что надо. Буду разбираться Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ikambi 0 Жалоба Опубликовано August 4, 2011 Делаю приложение с использованием 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" для создания указателя на член Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 4, 2011 Перемудрили cvSetMouseCallback( "CAMERA", ClickOnCVScreen, (void*) image); Вам не подходит (эта функция работает с другим прототипом функции обратного вызова) и не нужно. засуньте все в private: System::Void ClickOnCVScreen(int event, int x, int y, int flags, void* param ) пересчитайте координаты и будет Вам счастье. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ikambi 0 Жалоба Опубликовано August 4, 2011 Вот мой код. Что толку если я все запишу в 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; } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 4, 2011 А, ну да, в C# же нет указателей. Ну так напишите как он просит: &ocv_detect::Form1::ClickOnCVScreen вместо ClickOnCVScreen. Я не спец по шарпу, но думаю это может помочь. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ikambi 0 Жалоба Опубликовано August 4, 2011 А, ну да, в C# же нет указателей. Ну так напишите как он просит: &ocv_detect::Form1::ClickOnCVScreen вместо ClickOnCVScreen. Я не спец по шарпу, но думаю это может помочь. Это C++, Visual Studio 2008, пробовал и так, но не получается. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 4, 2011 а так, что пишет? void onMouse( int event, int x, int y, int /*flags*/, void* /*param*/ ) { if( event == CV_EVENT_LBUTTONDOWN ) { } } ... setMouseCallback( "CAMERA", onMouse, 0 ); ... [/code] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ikambi 0 Жалоба Опубликовано August 4, 2011 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" для создания указателя на член Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано August 4, 2011 Вот тут есть исходник библиотеки: http://www.codeproject.com/KB/cs/Intel_OpenCV.aspx поковыряйте, может найдете решение. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ikambi 0 Жалоба Опубликовано August 4, 2011 Вот тут есть исходник библиотеки: http://www.codeproject.com/KB/cs/Intel_OpenCV.aspx поковыряйте, может найдете решение. Спасибо, покопаюсь. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
TroyashkA 12 Жалоба Опубликовано August 17, 2011 А, ну да, в C# же нет указателей. ... В C# есть указатели, просто их надо использовать в unsafe-блоках и держать подальше от GC с помощью fixed Извините, если докопался невтему, просто решил защитить свой любимый язык 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Gogman 0 Жалоба Опубликовано April 10, 2012 Скажите пожалуйста ! Получилось ли избавиться от ошибки ? А то у меня такая же ситуация cvSetMouseCallback( "CAMERA", onMouse, 0 ); error C3867: ocv_detect::Form1::onMouse: в вызове функции отсутствует список аргументов; используйте "&ocv_detect::Form1::onMouse" для создания указателя на член Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах