Smorodov 578 Report post Posted December 23, 2011 cv::WaitKey нужон, т.к. именно в этой функции происходит обработка сообщений окна, а соответственно и вывод. Share this post Link to post Share on other sites
slicktail 1 Report post Posted December 25, 2011 cv::WaitKey нужон, т.к. именно в этой функции происходит обработка сообщений окна, а соответственно и вывод. Зачем здесь WaitKey, вывод ведь на форму осуществляется? Да и до этого не доходит, изображение считать не получается во frame. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted December 25, 2011 Может так сработает?: frame = cv::imread("C:\\1.bmp",-1); Значения для параметра flags: >0 загружается трехканальное цветное изображение =0 загружается изображение в серых тонах <0 загружается "как есть". Share this post Link to post Share on other sites
Виктор 0 Report post Posted January 8, 2012 Здравствуйте, столкнулся с проблемой. Как сделать так, что бы вывести изображение с камеры в оконом (не MFC/консольное) приложении? То есть сейчас у меня консольное и создается для каждой камеры новое окно. Спасибо. Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted January 9, 2012 Куда вывести-то? Share this post Link to post Share on other sites
Виктор 0 Report post Posted January 9, 2012 Куда вывести-то? В форму) Кажется я догадался что как почитав ни много форум. Smorodov Спасибо за перенос. Share this post Link to post Share on other sites
trinka 1 Report post Posted March 31, 2012 кто знает какой параметр преобразования использовать в ф-ии Image ^img = gcnew Bitmap(frame.cols, frame.rows, frame.step, PixelFormat::Format24bppRgb, IntPtr(frame.data)); а именно PixelFormat для CV_8U? пробовал PixelFormat::Format8bppIndexed, но израбоажение какое-то испорченное, но в принципе показывается. может его нужно как-то преобразовать? Share this post Link to post Share on other sites
Smorodov 578 Report post Posted March 31, 2012 Пост №7 из это темы не подходит? Share this post Link to post Share on other sites
trinka 1 Report post Posted March 31, 2012 Пост №7 из это темы не подходит? да в другом косяк был, забыл делать сглаживание Share this post Link to post Share on other sites
JoQeR 0 Report post Posted April 5, 2012 Здравствуйте! Можете объяснить как для визуализации кадров полученых с камеры использовать Tick таймера? Никола написал в посте, что его использует. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted April 5, 2012 Это читали? Ссылка на MSDN. Там есть ссылка на пример. Share this post Link to post Share on other sites
nagoHok 4 Report post Posted April 5, 2012 Здравствуйте! Можете объяснить как для визуализации кадров полученых с камеры использовать Tick таймера? Никола написал в посте, что его использует. Не советую использовать для этого таймер, ибо в карте сообщений системы он стоит самый последний, лучше для этого организовать отдельный поток. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted April 5, 2012 Согласен, что отдельный поток лучше. ЗЫ: есть еще мультимедиа таймер. У него приоритет повыше и точность до 1 мс. Но можно хорошо систему подвесить при неаккуратном использовании. Share this post Link to post Share on other sites
JoQeR 0 Report post Posted April 5, 2012 Спасибо, попробую реализовать потоками. А так сам пытался сделать используя этот пример MSDN Share this post Link to post Share on other sites
JoQeR 0 Report post Posted April 11, 2012 Написал подобный код, всё-таки с использованием таймера , пока что эксперементирую)В результате вроде все работает нормально, НО при закрытии формы (клик по баттон2) процесс остается висеть в диспетчере задач. Я так понял, что CvCapture не удаляется и не отпускает программу? Или в чем то другом косячу? Также при попытке вызывать cvReleasecapture(&capture) возникает ошибка. Еще заметил, что со временем, пусть медленно н оверно, начинает расти объем памяти занимаемы процессом. Помогите пожалуйста) ... private: CvCapture *capture; IplImage *frame; ... private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) { // получаем кадр frame = 0; frame = cvQueryFrame( capture ); // Копирование IplImage в объект .NET типа Image Image ^image = gcnew Bitmap(frame->width, frame->height,frame->widthStep, PixelFormat::Format24bppRgb, IntPtr(frame->imageData)); // показываем this->pictureBox1->Image = image; char c = cvWaitKey(33); if (c == 27) { // нажата ESC timer1->Stop(); } } ... private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { timer1->Stop(); //cvReleaseCapture(&capture); // <----- ошибка this->Close(); } ... Share this post Link to post Share on other sites
Smorodov 578 Report post Posted April 11, 2012 char c = cvWaitKey(33); А таймер на какой интервал? Я обычно делаю так: 1. Ставлю таймер (one shot). 2. В калбэке его останавливаю. 3. Выполняю все что нужно. 4. Запускаю следующий интервал. Share this post Link to post Share on other sites
JoQeR 0 Report post Posted April 11, 2012 Т.е. char c = cvWaitKey(33); держит процесс?? Таймер на интервал 50 мс. А что насчет cvReleaseCapture? Почему вылезает ошибка на несоотвествие типов? И насчет роста занимаемого объема памяти можете что-нибудь посоветовать? А то напрягает очень, здесь на форуме находил про утечки памяти, но здесь похоже что то другое. За раннее спасибо! Share this post Link to post Share on other sites
Smorodov 578 Report post Posted April 11, 2012 capture сделайте static - ом. По поводу утечки не знаю, ибо в clr я слаб. Мне не нравится это: Image ^image = gcnew Bitmap(frame->width, frame->height,frame->widthStep, PixelFormat::Format24bppRgb, IntPtr(frame->imageData));[/code] я привык к каждому new видеть delete, но вроде это само выгребаеться должно. 1 Share this post Link to post Share on other sites
JoQeR 0 Report post Posted April 11, 2012 На самом деле пробовал я удалять с помощью delete image, всё равно растет. Единственно что утешает, это что память занимается очень медленно, иногда чуток убывает. Но все равно спасибо вам) Share this post Link to post Share on other sites
JoQeR 0 Report post Posted April 12, 2012 Чет всё равно не удается закрыть процесс( Что еще можно сделать? Что именно с cvWaitKey() проделать? И зачем делать capture статиком? Share this post Link to post Share on other sites
JoQeR 0 Report post Posted April 12, 2012 Решил проблемму с закрытием процесса, но по-моему как то по извращенски просто переопределив переменную в обработчике закрытия формы. Потому что static у CvCapture *capture, ничего не изменил и не устранил ошибку с cvReleaseCapture: private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { CvCapture *capture; // Переопределяем capture и удаляем этот объект timer1->Stop(); capture = cvCreateCameraCapture(CV_CAP_ANY); cvReleaseCapture(&capture); this->Close(); } Share this post Link to post Share on other sites
Антон 0 Report post Posted April 20, 2012 Здравствуйте! Никак не могу подключить openCV 2.3.1 к VC++. Подключил dll-ки как в посте №7. Библиотеки #include <opencv/cv.h> #include <opencv/highgui.h>. Приложение Windows Forms. Что бы я не делал выдает ошибки на какой-то cvRound (10 ошибок). Код и форма пустые... Помогите, пожалуйста. Ах да, компилятор Visual C++ 2008 Share this post Link to post Share on other sites
Антон 0 Report post Posted April 20, 2012 Прошу прощения, вопрос решил) Забыл изменить: General/Common Language Runtime Support: Common Language Runtime Support (/clr) До этого стоял: CLR-поддержка чистого MSIL (/clr:pure) Share this post Link to post Share on other sites
Flame 1 Report post Posted April 27, 2012 Не советую использовать для этого таймер, ибо в карте сообщений системы он стоит самый последний, лучше для этого организовать отдельный поток. Подскажите как это реализовать? Без таймера используя 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, но это тут непринципиально, просто хочу понять принцип как в отдельном потоке сделать Share this post Link to post Share on other sites
Smorodov 578 Report post Posted April 27, 2012 Пост №9 смотрели? Share this post Link to post Share on other sites