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

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

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

Студворк — интернет-сервис помощи студентам
Помогите разобраться почему не работает программа для записи видео с экрана.Программа компилируется,но при запуске выскакивает исключение
System.Runtime.InteropServices.SEHExcept ion" в приложении ЗАГОТОВКА_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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.05.2017, 12:42
Ответы с готовыми решениями:

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

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

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

6
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
27.05.2017, 16:00
Лучший ответ Сообщение было отмечено vvch43 как решение

Решение

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

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

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

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

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

Добавлено через 3 минуты
И последнее - записанный файл имеет скорость значительно выше чем источник записи. Менял параметр в cvWaitKey - не помогает
0
1 / 1 / 0
Регистрация: 28.04.2015
Сообщений: 62
29.05.2017, 18:39  [ТС]
С прерывание цикла разобрался.Пришлось цикл запустить в другом потоке,используя компонент BackgroundWorker.
А с другой проблемой не знаю,что делать.
Пытался-пытался,но так сам и не разобрался. Полученное в результате записи видео воспроизводится со скоростью вмного выше ,чем оригинал,с которого пишу.В чем может быть дело ?
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
29.05.2017, 21:10
Лучший ответ Сообщение было отмечено 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
1 / 1 / 0
Регистрация: 28.04.2015
Сообщений: 62
30.05.2017, 21:16  [ТС]
Спасибо за совет,с утра попробую и отпишусь по результату

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

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

cvWriteFrame(writer, frame);
Количество итераций этого цикла и изменяет скорость записи-воспроизведения
0
 Аватар для Sklifosofsky
1086 / 916 / 213
Регистрация: 29.09.2015
Сообщений: 1,019
30.05.2017, 22:53
Должна быть настройка параметров записи и синхронизация на подобии в dx. Тут надо доки копать
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
30.05.2017, 22:53
Помогаю со студенческими работами здесь

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

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

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

Не работает функция
&lt;? function getTable($cols,$rows,$color) { echo &quot;&lt;table border=1 style='background:$color'&gt;&quot;; for($i=0 ;...

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


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru