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

OpenCV + WinForm

Recommended Posts

Здравствуйте знатоки компьютерного зрения. У меня к вам несколько вопросов. 

1 При запуске OpenCV в WindowsFormAppication появляется вот такая ошибка (см. рисунок)

если нажать кнопку ПОВТОР то появляется другое сообщение

ShiftVideoWin.exe привело в действие точку остановка

и затем указывает на строчку кода

_ASSERTE(_CrtIsValidHeapPointer(pUserData));  в модуле dbgheap.c   Как с этим совладать?

2  Для работы с OpenCV под WinForm была разработана emgucv. Но она построена для C#. Есть ли возможность использовать ее под С++. И (обшарил весь нет честно) подскажите сайт (если такой вообще имеется в природе) где бы описывалась работа с  emgucv  наподобе http://robocraft.ru/blog/computervision/264.html

3  В своей программе я использую 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 255

static 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; // Очередной фрейм

else

return 0;

 

ErrorOpenCV.bmp

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×