Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/21: Рейтинг темы: голосов - 21, средняя оценка - 4.57
0 / 0 / 0
Регистрация: 04.02.2012
Сообщений: 15

Захват изображения с камеры

10.10.2014, 13:25. Показов 4226. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть некая камера со своим SDK. Пишу простенькое приложение для захвата с неё изображения. Ниже пробный код, который по нажатию кнопки начинает захват. Забрать один кадр получается, pictureBox1 отображает корректно.

C#
1
2
3
4
5
6
7
8
9
10
11
IntPtr ptr = IntPtr.Zero;
Bitmap bmp = new Bitmap(1280, 960, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
BitmapData bd;
bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
ptr = bd.Scan0;
if (AICameraDll.getImageData(ptr, bd.Stride, -1))
{
     bmp.UnlockBits(bd);
     pictureBox1.Image = bmp;  
}
else MessageBox.Show("Error");
Если пытаюсь завернуть в бесконечный цикл, то ни одного кадра pictureBox1 не отрисовывает, так и остается пустым.

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
IntPtr ptr = IntPtr.Zero;
Bitmap bmp = new Bitmap(1280, 960, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
BitmapData bd;
while (true)
{
     bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
     ptr = bd.Scan0;
     if (AICameraDll.getImageData(ptr, bd.Stride, -1))
     {
          bmp.UnlockBits(bd);
          pictureBox1.Image = bmp;
          //Thread.Sleep(1000);  Пытался поставить задержу... Не помогает.
     }
     else MessageBox.Show("Error");
}

Если с первым кодом регулярно нажимать на кнопку, то кадр обновляется.
ЧЯДНТ?
СПС!
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
10.10.2014, 13:25
Ответы с готовыми решениями:

Захват изображения с видеокамеры -> реакция на движение -> снимок с камеры
Здравствуйте, форумчане! Помогите пожалуйста реализовать захват камеры с последующим детектором движения и снимком, который...

Необходимо организовать захват отдельного кадра (а не видео) с камеры
Необходимо организовать захват отдельного кадра (а не видео) с камеры, при чём сделать это максимально быстро и сохранить его на диск......

Захват изображения с видеокамер/вебкамеры
Собственно сабж: еть вывод на экран видео,в определенный момент нужно сделать снимок(photo shot). Кто сталкивался, помогите плз,что то...

9
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
10.10.2014, 13:35
d_w, скорее всего нужно вынести в отдельный поток
0
Заблокирован
10.10.2014, 13:47
Естественно форма не успевает отрисоватся а следующий кадр уже просится... Как выход попробуйте использовать BackgroundWorker в него занесите код кнопки возбуждайте событие progresschanged

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            IntPtr ptr = IntPtr.Zero;
Bitmap bmp = new Bitmap(1280, 960, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
BitmapData bd;
while (true)
{
     bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
     ptr = bd.Scan0;
     if (AICameraDll.getImageData(ptr, bd.Stride, -1))
     {
          bmp.UnlockBits(bd);
         backgroundWorker1.ReportProgress(0,bmp);
     }
     else MessageBox.Show("Error");
}
        }
 
        // This event handler updates the progress.
        private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
        {
           pictureBox1.Image = e.UserState as Bitmap;
        }
Не панаценя но должна помочь в нажатие кнопки backgroundWorker1.RunWorkerAsync();
0
76 / 77 / 40
Регистрация: 03.06.2014
Сообщений: 463
10.10.2014, 13:50
Таймер и button.PerformClick(); ))))
0
0 / 0 / 0
Регистрация: 04.02.2012
Сообщений: 15
10.10.2014, 13:58  [ТС]
Попробовал с потоком так:

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
private void button3_Click(object sender, EventArgs e)
{
     AICameraDll.startCapture();
     Thread threadGetImage = new Thread(GetImage);
     threadGetImage.IsBackground = true;
     threadGetImage.Start();
}
 
public void GetImage()
{
     Bitmap bmp = new Bitmap(1280, 960, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
     IntPtr ptr = IntPtr.Zero;
     BitmapData bd;
     while (true)
     {
          bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
          ptr = bd.Scan0;
          if (ASICameraDll.getImageData(ptr, bd.Stride, -1))
          {
               bmp.UnlockBits(bd);
               pictureBox1.Image = bmp;
               Thread.Sleep(100);
          }
          else MessageBox.Show("Error");
      }
}

Да, товарищи помогло! Спасибо!
Только без Thread.Sleep тоже не успевало отрисовывать. Но тут уже понятно куда копать.
0
814 / 422 / 169
Регистрация: 08.02.2013
Сообщений: 711
10.10.2014, 14:34
Лучший ответ Сообщение было отмечено d_w как решение

Решение

AsUWish, но так не пойдет все равно. Нужно иметь две картинки - в одну пишем, вторая на форме, потом менять.

Добавлено через 36 минут
нет, серьезно - совсем нет проблем с многопоточностью? Мне интересно просто. Должно быть как-то так имхо:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
new Thread(() =>
{
    Bitmap[] buff = new Bitmap[2];
    buff[0] = new Bitmap(1280, 960, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
    buff[1] = new Bitmap(buff[0]);
 
    int i = 0;
    while (true)
    {
        Bitmap bmp = buff[i = ++i % 2];
        BitmapData bd = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.ReadWrite, bmp.PixelFormat);
        CopyMemory(bd.Scan0, source, (uint)(bd.Stride * bd.Height)); // тут копирование
        bmp.UnlockBits(bd);
        this.Invoke((MethodInvoker)delegate()
        {
            pictureBox1.Image = bmp;
        });
    }
}) { IsBackground = true }.Start();
2
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 1,035
20.10.2014, 09:23
Цитата Сообщение от d_w Посмотреть сообщение
bd = bmp.LockBits
А unlock где?
0
0 / 0 / 0
Регистрация: 04.02.2012
Сообщений: 15
20.10.2014, 13:16  [ТС]
Цитата Сообщение от Khludenkov Посмотреть сообщение
А unlock где?
Строка 20? https://www.cyberforum.ru/post6703680.html



А не подскажет никто алгоритм быстрого применения регулировки гистограммы изображения? Изображение 4K 16bit greyscale. Правда это оффтоп. Поищу пару дней, и в отдельную тему вероятно выведу.
0
37 / 31 / 5
Регистрация: 30.04.2014
Сообщений: 1,035
20.10.2014, 14:06
Да, не посмотрел весь код. Не совсем понял что такое
Цитата Сообщение от d_w Посмотреть сообщение
алгоритм быстрого применения регулировки гистограммы изображения
Если надо цветокоррекцию, то обычно делается трёхмерный массив. 256*256*256. Это для цветного.

А для серого массив из 65536 двухбайтных элементов. Индекс элемента - это номер исходного цвета. Значение элемента - это новое значение цвета. Берёшь исходный цвет, обращаешься по его номеру к массиву и там будет новое значение цвета.
0
0 / 0 / 0
Регистрация: 04.02.2012
Сообщений: 15
20.10.2014, 14:21  [ТС]
Цитата Сообщение от Khludenkov Посмотреть сообщение
А для серого массив из 65536 двухбайтных элементов. Индекс элемента - это номер исходного цвета. Значение элемента - это новое значение цвета. Берёшь исходный цвет, обращаешься по его номеру к массиву и там будет новое значение цвета.

Да, примерно так. Есть ushort[] диапазона 0-65K. Полезная инфа чаще всего находится в узком диапазоне 1К-2К. Строю гистограмму изображения и два ползунка, регулирующих диапазон яркости исходного изображения, который потом преобразую в диапазон 0-255 для вывода на экран. На подобие фотошопного Levels(Уровни).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.10.2014, 14:21
Помогаю со студенческими работами здесь

Низкая скорость захват изображения с монитора
Привет. Есть (точнее уже угасает..) мысль - построить простенький аналог TeamViewer, сам он не подходит т.к. платный, Ammy admin...

Сохранение изображения с веб-камеры без использования буфера обмена
Здравствуйте, написал класс для работы с веб камерой из чужого примера, там та же самая проблема - для сохранения кадра используется буфер...

Захват кадров с камеры
Доброго времени суток! Столкнулась с задачей написания приложения для захвата кадров с USB-камеры. Родное приложение для камеры...

Захват изоображения с веб-камеры
Необходимо при нажатии на кнопку получить в объект <Image/> изоображение с Web-Камеры.

Захват видео изображения с веб-камеры
Возникли проблемы при создании массива в C#.В общем дело обстоит так: имеется захват видео изображения с веб-камеры,необходимо сделать,...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru