Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++/CLI Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
vvch43
1 / 1 / 0
Регистрация: 28.04.2015
Сообщений: 62
1

Не работает функция cvWriteFrame

27.05.2017, 12:42. Просмотров 859. Ответов 6
Метки нет (Все метки)

Помогите разобраться почему не работает программа для записи видео с экрана.Программа компилируется,но при запуске выскакивает исключение
System.Runtime.InteropServices.SEHException" в приложении ЗАГОТОВКА_OpenCV_WF.exe

Дополнительные сведения: Внешний компонент создал исключение.

В стеке вызовов: "указанные ниже фреймы могут быть неверны и(или) отсутствовать,символы для opencv_core220d.dll не загружены"

Проверяю frame - через cvShowImage( "original", frame ) - все в порядке.А записываться он не хочет. Вот код






C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) {
    
                 
    const char *filename = "C:\\Users\\валера\\Pictures\\Video.avi";
 
    
                 Graphics^ graph;           
  Bitmap^ bitmap;
     //cvNamedWindow("original",CV_WINDOW_AUTOSIZE);
         bitmap = gcnew Bitmap (Screen::PrimaryScreen->Bounds.Width,Screen::PrimaryScreen->Bounds.Height);  
      CvSize size = cvSize(Screen::PrimaryScreen->Bounds.Width, Screen::PrimaryScreen->Bounds.Height);
     
     CvVideoWriter *writer = cvCreateVideoWriter(filename, CV_FOURCC('D','I','V','X'), 25, size, 1);
       
     
     assert(writer!=0);  
   while(true){
     
  
    graph = Graphics::FromImage(bitmap);     
         graph->CopyFromScreen(0,0,0,0,bitmap->Size); 
System::Drawing::Rectangle Rect(0,0,bitmap->Width,bitmap->Height);
         
        Bitmap ^ bitmap1 = bitmap->Clone(Rect, Imaging::PixelFormat::Format32bppRgb);
 
 
           System::Drawing::Imaging::BitmapData^ bmData = bitmap->LockBits(
            System::Drawing::Rectangle(0, 0, bitmap1->Width, bitmap1->Height) ,
            System::Drawing::Imaging::ImageLockMode::ReadWrite,bitmap1-> PixelFormat);
        
            frame = cvCreateImage(cvSize(bitmap1->Width , bitmap1->Height) , IPL_DEPTH_8U , 4);
        frame->imageData = (char*)bmData->Scan0.ToPointer();
            cvNamedWindow("original",CV_WINDOW_AUTOSIZE);    
             
        
        cvWriteFrame(writer, frame);
                 // cvShowImage( "original", frame );
 
                  cvWaitKey(5);
   bitmap->UnlockBits(bmData);
   }
                  cvReleaseCapture( &capture );
             cvReleaseVideoWriter(&writer);
       // cvDestroyWindow("capture");
   
   }
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.05.2017, 12:42
Ответы с готовыми решениями:

Функция cin.get(array, 80) работает в одной программе, но не работает в другой
Добрый день. Я что то совсем запутался, одна и та же функция в одной программе работает, а в...

Функция корректно работает в Delphi 7 и не неверно работает в RAD Studio 10
Переписываю свою программу с Delphi 7 под RAD Studio 10. Столкнулся с проблемой - функция в...

В VS 2015 не работает рекурсивная функция, которая работает в C++Builder
Добрый день! Перенес блок кода из старого учебного проекта под C++Builder, который там всегда...

Стандартная функция delete в Eclipse работает а в AndroidStudio не работает
case R.id.btnDelete: {//Кнопка удаление последнего символа ...

Как функция работает,в обработчике не работает
В таком виде все прекрасно работает (function ($) { $.fn.percent = function...

6
Sklifosofsky
935 / 798 / 193
Регистрация: 29.09.2015
Сообщений: 955
27.05.2017, 16:00 2
Лучший ответ Сообщение было отмечено vvch43 как решение

Решение

строка 24. Вы вроде хотели получать картинку 8bppIndexed - индексированные цвета (до 256)

строка 31. По докам http://docs.opencv.org/2.4/modules/core/doc/old_basic_structures.htm. Для 8 битного формата пиксела вы указали количество каналов 4, хотя скорее всего в таком формате нету альфа канала и поэтому следует указать 3 (RGB)

В итоге получается, что вы данные 32 битного изображения пытаетесь скрестить с 8 битным

Добавлено через 10 минут
Хотя может не так понял=)
1
vvch43
1 / 1 / 0
Регистрация: 28.04.2015
Сообщений: 62
28.05.2017, 11:31  [ТС] 3
Спасибо за подсказку. Поменял число каналов на 3 и все пошло. Но видео отвратительного качества. Методом "тыка" нашел оптимальный вариант,когда и прога работает и качество записи отличное - преобразую не в 8bppIndexed ,а в 24pbbRgb оставляя 3 канала.
Возникла другая проблема - переполнение памяти. Решил освобождать память под frame в конце каждого цикла через cvReleaseImage(&frame).Но выскакивает ошибка - cvReleaseImage: невозможно преобразовать параметр 1 из "cli::interior_ptr<Type>" в "IplImage **"
Ту я не могу понять в чем дело. ведь frame объявлен как IplImage*frame
когда использую frame = nullptr то все нормально

Добавлено через 45 минут
И еще одна проблема - не срабатывает break, цикл не разрывается. Приходится закрывать через Диспетчер задач

Добавлено через 3 минуты
И последнее - записанный файл имеет скорость значительно выше чем источник записи. Менял параметр в cvWaitKey - не помогает
0
vvch43
1 / 1 / 0
Регистрация: 28.04.2015
Сообщений: 62
29.05.2017, 18:39  [ТС] 4
С прерывание цикла разобрался.Пришлось цикл запустить в другом потоке,используя компонент BackgroundWorker.
А с другой проблемой не знаю,что делать.
Пытался-пытался,но так сам и не разобрался. Полученное в результате записи видео воспроизводится со скоростью вмного выше ,чем оригинал,с которого пишу.В чем может быть дело ?
0
Sklifosofsky
935 / 798 / 193
Регистрация: 29.09.2015
Сообщений: 955
29.05.2017, 21:10 5
Лучший ответ Сообщение было отмечено vvch43 как решение

Решение

Только одно - копать доки OpenCV

Добавлено через 31 минуту
Вы проверяли сколько раз цикл срабатывает в секунду? Тут же надо учесть затрату на преобразования. И в обще делать скрин через ресурсы net немного ресурсоемко нежели через winapi.

Я считаю это ресурсозатратное действие - строка 24
Цитата Сообщение от vvch43 Посмотреть сообщение
Bitmap ^ bitmap1 = bitmap->Clone(Rect, Imaging::PixelFormat::Format32bppRgb)
В 10 строке укажите сразу формат данных
C++
1
bitmap = gcnew Bitmap (Screen::PrimaryScreen->Bounds.Width,Screen::PrimaryScreen->Bounds.Height, Imaging::PixelFormat::Format24bppRgb);
А 24 удалите
0
vvch43
1 / 1 / 0
Регистрация: 28.04.2015
Сообщений: 62
30.05.2017, 21:16  [ТС] 6
Спасибо за совет,с утра попробую и отпишусь по результату

Добавлено через 10 часов 34 минуты
Да,Вы правы,как я не заметил,что необходимый мне формат можно получить сразу без дополнительного клонирования ?!
Но ,к сожалению,на скорость это не повлияло. Все также,скорость записанного значительно выше скорости видео на экране

Добавлено через 12 часов 2 минуты
Решил проблему скорости.Возможно примитивно,но решение работает. Понимая,что не могу (или еще не умею) увеличить продолжительность воспроизведения каждого frame я решил просто увеличить количество одинаковых frame в каждом цикле.Т.е. в основном цикле создаю внутрений while в котором повторяется одна команда -

cvWriteFrame(writer, frame);
Количество итераций этого цикла и изменяет скорость записи-воспроизведения
0
Sklifosofsky
935 / 798 / 193
Регистрация: 29.09.2015
Сообщений: 955
30.05.2017, 22:53 7
Должна быть настройка параметров записи и синхронизация на подобии в dx. Тут надо доки копать
0
30.05.2017, 22:53
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.05.2017, 22:53

Функция MapAndLoad() работает с dll-файлом, не работает с exe-файлом
Доброго времени суток. Объясните, почему программа #include &lt;windows.h&gt; #include &lt;imagehlp.h&gt;...

Не работает функция
Не работает функция write класса Losers. Вызов происходит в 60-й строчке. #include &lt;iostream&gt;...

Не работает функция
Недавно я начал изучать объектно ориентированный php. Не совсем понимаю, почему не выводятся...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.