Sergey1985 0 Жалоба Опубликовано September 28, 2015 Здравствуйте знатоки компьютерного зрения. У меня к вам несколько вопросов. 1 При запуске OpenCV в WindowsFormAppication появляется вот такая ошибка (см. рисунок)если нажать кнопку ПОВТОР то появляется другое сообщениеShiftVideoWin.exe привело в действие точку остановкаи затем указывает на строчку кода_ASSERTE(_CrtIsValidHeapPointer(pUserData)); в модуле dbgheap.c Как с этим совладать?2 Для работы с OpenCV под WinForm была разработана emgucv. Но она построена для C#. Есть ли возможность использовать ее под С++. И (обшарил весь нет честно) подскажите сайт (если такой вообще имеется в природе) где бы описывалась работа с emgucv наподобе http://robocraft.ru/blog/computervision/264.html3 В своей программе я использую TrackBarвот код#include "stdafx.h"#include "io.h"#include <Windows.h>#include <conio.h>#include <stdio.h>#include "opencv2/core/core.hpp"#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"using namespace cv;bool usephase = false;Mat frame, rectfr, curr, prev, curr64f, prev64f, hann;int timedelay=40;int n;VideoCapture video;char names[20][260];#define LIM_STR 255static void on_trackbar(int pos, void*){ video.set(CV_CAP_PROP_POS_FRAMES,pos);}int _tmain(int argc, _TCHAR* argv[]){ int key = 0; setlocale(LC_ALL,"Russian"); printf("%s"," Программа обработки видео\n"); // Поиск файлов FILE *pFile; char szBuffer[LIM_STR]; struct _finddata_t findData; intptr_t hFile; HANDLE hndl=GetStdHandle(STD_OUTPUT_HANDLE);//вот эта строка int nr = 1; // количество видео треков int nrmax; // максимальное количество видео треков if((hFile = _findfirst("*.avi", &findData ))==-1L) printf("Файлы видео не найдены\n"); else { printf("Список доступных видео роликов\n"); printf("Выберите нужный из списка\n"); SetConsoleTextAttribute(hndl,FOREGROUND_GREEN|FOREGROUND_INTENSITY); do { if (nr == 1) SetConsoleTextAttribute(hndl,FOREGROUND_BLUE|FOREGROUND_INTENSITY); else SetConsoleTextAttribute(hndl,FOREGROUND_GREEN|FOREGROUND_INTENSITY); printf("%s\n",findData.name); strcpy(names[nr],findData.name); nrmax = nr; nr++; } while ( _findnext ( hFile, &findData ) == 0); }; _findclose (hFile); int k; CONSOLE_SCREEN_BUFFER_INFO bi; GetConsoleScreenBufferInfo(hndl, &bi); COORD cursorPos; cursorPos.X = 0; cursorPos.Y = 3; SetConsoleCursorPosition(hndl, cursorPos); nr = 1; cursorPos.X = 0; cursorPos.Y = 3; bool boolnext = true; while (boolnext) { k = getch(); if (k==13) { boolnext = false; cursorPos.X = 0; cursorPos.Y = 3+nrmax; SetConsoleCursorPosition(hndl, cursorPos); } if (k==72) // стрелка вверх { if (nr>1) { SetConsoleTextAttribute(hndl,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // поменяли цвет printf("%s",names[nr]); // вывели строчку // Перепрыгнули выше cursorPos.X = cursorPos.X; cursorPos.Y = cursorPos.Y-1; SetConsoleCursorPosition(hndl, cursorPos); SetConsoleTextAttribute(hndl,FOREGROUND_BLUE|FOREGROUND_INTENSITY); // поменяли цвет nr--; printf("%s",names[nr]); // вывели строчку SetConsoleCursorPosition(hndl, cursorPos); } } if (k==80) // стрелка вниз { if (nr<nrmax) { SetConsoleTextAttribute(hndl,FOREGROUND_GREEN|FOREGROUND_INTENSITY); // поменяли цвет printf("%s",names[nr]); // вывели строчку // Перепрыгнули ниже cursorPos.X = cursorPos.X; cursorPos.Y = cursorPos.Y+1; SetConsoleCursorPosition(hndl, cursorPos); SetConsoleTextAttribute(hndl,FOREGROUND_BLUE|FOREGROUND_INTENSITY); // поменяли цвет nr++; printf("%s",names[nr]); // вывели строчку SetConsoleCursorPosition(hndl, cursorPos); } } } SetConsoleTextAttribute(hndl,COMMON_LVB_LEADING_BYTE|FOREGROUND_INTENSITY); video.open(names[nr]); int w = video.get(CV_CAP_PROP_FRAME_WIDTH); int h = video.get(CV_CAP_PROP_FRAME_HEIGHT); printf(" Ширина кадра = %i\n",(int)w); printf(" Высота кадра = %i\n",(int)h); Rect r = Rect(35, 30, 545, 430); // Определение прямоугольника для ИОР // Показываем ползунок int currentPosition=0; int frames = (int)video.get(CV_CAP_PROP_FRAME_COUNT); printf(" Количество кадров = %i\n",(int)frames); float com_time = video.get(CV_CAP_PROP_FPS); printf(" CV_CAP_PROP_FPS = %f\n",com_time); cv::namedWindow("phase shift",0); createTrackbar("Position", "phase shift", & currentPosition, frames, on_trackbar); do { video >> frame; // Очередной фрейм if (usephase) { cvtColor(frame, curr, CV_RGB2GRAY); // Перевод в градации серого if(prev.empty()) { prev = curr.clone(); // клонирование изображения createHanningWindow(hann, curr.size(), CV_64F); // Создание окна Ханна } prev.convertTo(prev64f, CV_64F); curr.convertTo(curr64f, CV_64F); //определения сдвигов между двумя изображениями Point2d shift = phaseCorrelate(prev64f, curr64f, hann); // Фазовая корреляция double radius = cv::sqrt(shift.x*shift.x + shift.y*shift.y); // Вычисление радиуса отклонения Point center(curr.cols >> 1, curr.rows >> 1); n = video.get(CV_CAP_PROP_POS_FRAMES); int tpos = (int)video.get(CV_CAP_PROP_POS_MSEC); int sec = tpos/1000; int msec = tpos%1000; printf("n = %i",(int)n); printf(" x = %f",shift.x); printf(" y = %f",shift.y); printf(" время = %i сек %i мсек",sec,msec); printf("%s\n",""); } n = (int)video.get(CV_CAP_PROP_POS_FRAMES); /// ПРОБЛЕМА ЗДЕСЬ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //cv::setTrackbarPos("Position", "phase shift",n); imshow("phase shift", frame); key = waitKey(timedelay); if (key == 32) // нажали пробел { usephase = !usephase; if (usephase) timedelay = 500; else timedelay = 40; } prev = curr.clone(); if (video.get(CV_CAP_PROP_POS_FRAMES) == video.get(CV_CAP_PROP_FRAME_COUNT)) return 0; } while((char)key != 27); // Esc to exit... return 0;}При этом я хочу чтобы ползунок перемещался согласно номеру выдаваемого кадра вот таким образом n = (int)video.get(CV_CAP_PROP_POS_FRAMES); /// ПРОБЛЕМА ЗДЕСЬ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! //cv::setTrackbarPos("Position", "phase shift",n);Перемещаться он перемещается но при этом программа начинает жутко тормозить а цифры отображаемые TrackBar'ом мигать.Что я делаю не так.4 и последний вопрос если я Вас еще не ....... утомил. Как сделать проверку на существование очередного выводимого кадраIf (если есть еще кадры) video >> frame; // Очередной фреймelsereturn 0; ErrorOpenCV.bmp Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах