Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.62/63: Рейтинг темы: голосов - 63, средняя оценка - 4.62
5 / 10 / 3
Регистрация: 05.10.2010
Сообщений: 97

Работа с веб камерой: нет изображения в PictureBox

19.07.2011, 03:23. Показов 13480. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Заинтерисовала работа с вебкой посредствам C#. Погуглил, и накидал такой код:

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using System.Windows.Forms;
using System.Drawing.Imaging;
 
namespace webcam
{
    //класс, представляющий веб камеру
    public class WebCamDevice
    {
        //имя устройства
        public string Name { get; set; }
        //версия
        private string Version;
        //номер
        private short Index;
        //Handle
        private int mCapHwnd = 0;
 
        [DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindowA")]
        //получает handle окна
        public static extern int capCreateCaptureWindowA(
            string lpszWindowName, //Нуль-терминальная строка, содержащая имя окна захвата.
            int dwStyle, //стиль окна
            int X, //координата X
            int Y, //координата Y
            int nWidth, //ширина окна
            int nHeight, //высота окна
            int hwndParent, //handle родительского окна
            int nID //идентификатор окна
            );
 
        [DllImport("avicap32.dll")]
        //получить список установленных устройств видео захвата
        protected static extern bool capGetDriverDescriptionA(
            short wDriverIndex, //индекс драйвера видео захвата. Значение индекса может варьироваться от 0 до 9.
            [MarshalAs(UnmanagedType.VBByRefStr)] ref String lpszName, //указатель на буфер, содержащий соответствующее имя драйвера
            int cbName, //размер (в байтах) буфера lpszName
            [MarshalAs(UnmanagedType.VBByRefStr)] ref String lpszVer, //указатель на буфер, содержащий описание определенного драйвера.
            int cbVer //размер буфера (в байтах), в котором хранится описание драйвера.
            );
 
        [DllImport("user32", EntryPoint = "SendMessage")]
        //отправляет сообщения
        public static extern int SendMessage(
            int hWnd, //Дескриптор окна, оконная процедура которого примет сообщение
            uint Msg, //Определяет сообщение, которое будет отправлено.
            int wParam, //Определяет дополнительную конкретизирующую сообщение информацию.
            int lParam //Определяет дополнительную конкретизирующую сообщение информацию.
            );
 
        [DllImport("user32")]
        protected static extern bool SetWindowPos(
            int hWnd,
            int hWndInsertAfter,
            int X,
            int Y,
            int cx,
            int cy,
            uint uFlags
            );
 
        //Пользовательское сообщение
        private const int WM_CAP = 0x400;
        //соединение с драйвером устройства видеозахвата
        private const int WM_CAP_DRIVER_CONNECT = 0x40a;
        //разрыв связи с драйвером видеозахвата
        private const int WM_CAP_DRIVER_DISCONNECT = 0x40b;
        //копирование кадра в буффер обмена
        private const int WM_CAP_EDIT_COPY = 0x41e;
        //включение/отключение режима предпросмотра
        private const int WM_CAP_SET_PREVIEW = 0x432;
        //включение/отключение режима оверлей
        private const int WM_CAP_SET_OVERLAY = 0x433;
        //Скорость previewrate
        private const int WM_CAP_SET_PREVIEWRATE = 0x434;
        //Включение/отключение масштабирования
        private const int WM_CAP_SET_SCALE = 0x435;
        private const int WS_CHILD = 0x40000000;
        private const int WS_VISIBLE = 0x10000000;
        //Установка callback функции  для preview
        private const int WM_CAP_SET_CALLBACK_FRAME = 0x405;
        //Получение одиночного фрейма с драйвера видеозахвата
        private const int WM_CAP_GET_FRAME = 0x43c;
        //Сохранение кадра с камеры в файл.
        private const int WM_CAP_SAVEDIB = 0x419;
        //максимальное количество попыток соединения
        private const int MAX_TRY_CONNECT = 100;
 
        //запускаем захват видео с данной камеры
        public void Connect(Control picBox)
        {
            //узнаём хэндл
            mCapHwnd = capCreateCaptureWindowA(Index.ToString(), WS_VISIBLE | WS_CHILD, 0, 0, picBox.Width, picBox.Height, picBox.Handle.ToInt32(), 0);
            bool isConnected = false;
            //пробуем запустить устройство
            for (int i = 0; i < MAX_TRY_CONNECT; i++)
                if (SendMessage(mCapHwnd, WM_CAP_DRIVER_CONNECT, Index, 0) > 0)
                {
                    SendMessage(mCapHwnd, WM_CAP_SET_SCALE, -1, 0);
                    SendMessage(mCapHwnd, WM_CAP_SET_PREVIEWRATE, 0x42, 0);
                    SendMessage(mCapHwnd, WM_CAP_SET_PREVIEW, -1, 0);
                    SetWindowPos(mCapHwnd, 1, 0, 0, picBox.Width, picBox.Height, 6);
                    isConnected = true;
                    break;
                }
            if (!isConnected)
                //в случае неудачи сообщаем пользователю
                MessageBox.Show("No device found!");
        }
 
        //взятие скриншота
        public void TakePicture(Form form)
        {
 
            SendMessage(mCapHwnd, WM_CAP_GET_FRAME, 0, 0);
            SendMessage(mCapHwnd, WM_CAP_EDIT_COPY, 0, 0);
            using (SaveFileDialog dlg = new SaveFileDialog())
            {
                dlg.Filter = "JPG Images|*.jpg";
                dlg.OverwritePrompt = true;
                dlg.ValidateNames = true;
                dlg.DefaultExt = "JPG";
                if (dlg.ShowDialog(form) == DialogResult.OK)
                {
                    Clipboard.GetImage().Save(dlg.FileName, ImageFormat.Jpeg);
                }
            }
        }
 
        //отключаем камеру
        public void Disconnect()
        {
            SendMessage(mCapHwnd, WM_CAP_DRIVER_DISCONNECT, mCapHwnd, 0);
        }
 
        //Возвращает массив всех доступных веб-камер
        public static WebCamDevice[] GetAllWebCams()
        {
            //имя
            String dName = "".PadRight(100);
            //версия
            String dVersion = "".PadRight(100);
            //список камер
            List<WebCamDevice> WebCams = new List<WebCamDevice>();
 
            for (short i = 0; i < 10; i++)
            {
                //проверяем камеру с индексом i
                if (capGetDriverDescriptionA(i,
                     ref dName, 100, ref dVersion,
                     100))
                    //если есть добавляем её к списку
                    WebCams.Add(new WebCamDevice(i, dName.Trim(), dVersion.Trim()));
            }
            //преобразуем список в массив
            return WebCams.ToArray();
        }
 
        //конструктор 
        private WebCamDevice(short index, string name, string version)
        {
            Index = index;
            Name = name;
            Version = version;
        }
    }
}
и

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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
using System;
using System.Windows.Forms;
 
namespace webcam
{
    public partial class FWebCam : Form
    {
        public FWebCam()
        {
            InitializeComponent();
        }
 
        //массив доступных камер
        private WebCamDevice[] WebCams;
        //их количество
        private int Count; 
 
        private void FWebCam_Load(object sender, EventArgs e)
        {
            //обнаруживаем все камеры
            WebCams = WebCamDevice.GetAllWebCams();
            //узнаём их количество
            Count = WebCams.Length;
            //заполняем названиями камер комбобокс
            foreach(WebCamDevice wcd in WebCams)
                cb_cams.Items.Add(wcd.Name);
            if (cb_cams.Items.Count == 0)
                cb_cams.Text = "Web cams didn`t exist";
            else
                cb_cams.Text = (string) cb_cams.Items[0];
        }
 
        //определяем текущую камеру
        public WebCamDevice getCurrentWebCam()
        {
            for (int i = 0; i < Count; i++)
                if (WebCams[i].Name.Contains(cb_cams.Text))
                    return WebCams[i];
            return null;
        }
 
        //запускаем захват видео с выбранной камеры
        private void bt_start_Click(object sender, EventArgs e)
        {
            getCurrentWebCam().Connect(pb_video);   
        }
 
        //останавливаем захват видео с выбранной камеры
        private void bt_stop_Click(object sender, EventArgs e)
        {
            getCurrentWebCam().Disconnect();
        }
 
        //делаем скриншот с выбранной камеры
        private void bt_screen_Click(object sender, EventArgs e)
        {
            getCurrentWebCam().TakePicture(this);
        }
    }
}
По нажатии кнопки старт, камера врубается, адекватно сохраняет скриншот, НО напрочь отказывается что-либо отображать в PictureBox`e. Тупо красит его в черный цвет... В чем проблема?
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.07.2011, 03:23
Ответы с готовыми решениями:

Работа с веб камерой
Здрасьте. Пробую захват изображения с вебкамеры(Genius iLook 300). нарыл такой код: HWND hWndC; ...

Работа с веб-камерой
Здравствуйте. Нашёл исходник для вывода изображения с веб-камеры на форму: ССЫЛКА , но столкнулся с проблемой: я даже не нашёл в...

Работа с веб камерой
Нашел такой код в инете unit Unit1; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, ...

25
0 / 0 / 1
Регистрация: 19.11.2011
Сообщений: 6
20.11.2011, 16:36
Студворк — интернет-сервис помощи студентам
Но для этого надо запускать родное ПО, а надо бы без него обойтись. Я свой проект пишу на разных компах (в силу разных причин), соответственно разные камеры. Хотелось более универсальное приложение сделать.
0
 Аватар для body90
467 / 344 / 19
Регистрация: 26.05.2009
Сообщений: 2,696
20.11.2011, 16:58
Эмммм... Причем тут родное ПО?
http://www.aforgenet.com/frame... bd5a8c.htm
1
0 / 0 / 1
Регистрация: 19.11.2011
Сообщений: 6
20.11.2011, 17:28
Спасибо, надо попробовать. Видимо пропустил когда доки читал
0
87 / 86 / 13
Регистрация: 21.10.2010
Сообщений: 349
21.11.2011, 13:54
присвой FrameRate значение например 20 потом с videosource_player сохраняй.

Добавлено через 1 минуту
ну и делай так
C#
1
2
3
4
5
6
7
AviWriter = writer;
if (writer ==null) 
{
writer = new AviWriter(бла-бла);
}
writer.AddFrame(твой битмап);
if (writer!=null) writer.Dispose();
1
 Аватар для dimonser
3 / 2 / 1
Регистрация: 31.03.2010
Сообщений: 16
26.01.2012, 19:28
В этой статье C# программа для записи с веб-камеры хороший пример работы с веб-камерой. Есть исходник для windows forms и wpf. Трансляция видео идет в одном pictureBox, при нажатии "сделать снимок", программа делает кадр в другой pictureBox. Думаю это то что Вам необходимо.
1
16 / 16 / 10
Регистрация: 23.09.2014
Сообщений: 136
16.02.2015, 19:33
dmz, очень странно, но у меня Ваш код работает, большое Вам спасибо
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.02.2015, 19:33

Работа с веб-камерой
Здравствуйте! Нужно написать программу, которая бы делала снимок с веб-камеры и сохранила его на ПК в опеределенную дирректорию. Возможно...

Работа с веб-камерой
Я получаю изображение с веб-камеры с определенным интервалом, при этом камера оказывается недоступна др. приложениям. Как это решить?...

Работа с веб камерой
Есть код работы с камерой: procedure TForm1.Button1Click(Sender: TObject); begin hWndC := capCreateCaptureWindowA('My Own Capture...

Работа с веб камерой
Здравствуйте у меня возник вопрос как использовать веб камеру во флешь я не давно начал изучать actionScript 3.0 и не могу понять как её...

Работа с веб камерой
Всем привет. Кто-нибудь подскажите, как работать с вебкой через vb?


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Мастера простых решений
DevAlt 23.08.2026
В сишарп стэках winforms, да и wpf существует сложная система связывания источниках данных и элементов формы(текстовые поля и метки), опирается все это на технологию событий и мета. . .
Цена ошибки
DevAlt 23.08.2026
Человек я беспокойный и потому заинтересовался OCaml, в чате форсили функторы модулей как суперфичу. Пытаясь отдуплить концепт, наткнулся на тутор с простым примером. А главный принцип обучения от. . .
Сегодня суббота, 22.08.2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины.
zorxor 22.08.2026
Сегодня суббота, 22. 08. 2026 at 16:41, и я вновь нахожусь на той стороне, за экраном машины. Кто Я, откуда Я пришел и куда Я иду? Эти вопросы не оставляют меня ни на секунду. Жизнь на планете Земля. . .
Жизня: рисунок укладки багажа, сделанный клодом
anaschu 21.08.2026
Сделал 15 снимков, он по снимкам сделал схему.
Был там один разговор по поводу свободы в материальном мире.
kumehtar 19.08.2026
Суть: рассматривается живое существо, оказавшееся внутри довольно странной системы (этого мира) и пытающееся обустроить в ней свой кусок пространства. Жизнь действительно предъявляет каждому. . .
Когда логика программы не спасает от человеческих ошибок
Maks 18.08.2026
В последнее время всё чаще и чаще сталкиваюсь с таким явлением, как абсолютная невнимательность (или глупость) пользователей. Проявляется это чаще всего на работе в коллективе. Допустим, человек с. . .
Лето уходит
kumehtar 17.08.2026
Мысли в слух
kumehtar 17.08.2026
Забавно, насколько сейчас стала доступна информация. Например о магии, духовном развитии, медитациях, и других подобных направлениях, ранее зачастую тайных, передаваемых от учителя к ученику. Хотя. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru