Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Мультимедиа в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2012, 17:08   #1
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию Получение картинки с веб-камеры

Снимаю картинку с веб-камеры через SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0). Всё получается, если только указать Handle при инициализации на форму или элемент управления формой (кнопка, панель), а надо поместить картинку на Image. Не смог получить дескриптор. Как можно сделать, только без дополнительных инсталяций?
Aleksandr_59 вне форума Ответить с цитированием
Старый 21.03.2012, 17:44   #2
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Цитата:
поместить картинку на Image
чем вызвано это желание?
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Старый 22.03.2012, 10:24   #3
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

Вообщето мне надо обработать Bitmap картинки. Программа для получения штрих-кода со снимка.
Aleksandr_59 вне форума Ответить с цитированием
Старый 22.03.2012, 12:08   #4
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

Для сохранения BITMAP:
Код:
 SendMessage(hWndC,
        WM_CAP_SAVEDIB,
        0,
        longint(pchar(FileName)));
Для сохранения в видеофайл:
Код:
 SendMessage(hWndC,
        WM_CAP_FILE_SET_CAPTURE_FILEA,
        0,
        Longint(pchar(FileName)));

 SendMessage(hWndC, WM_CAP_SEQUENCE, 0, 0);
Цитата:
Программа для получения штрих-кода со снимка
...в третьем нумере "Радиолюбителя" будет статья на данную тему, не просто получение в реальном времени штрих-кода с WEB-камеры, но и его распознавание тут же
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation

Последний раз редактировалось raxp; 22.03.2012 в 12:11.
raxp вне форума Ответить с цитированием
Старый 22.03.2012, 12:13   #5
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Получили картинку на форме, а потом обращайтесь попиксельно:
Код:
 Form1.Canvas.Pixels[i,j].
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 22.03.2012, 12:30   #6
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

Всё не то. Сохранять в файл, а потом грузить его для обработки - это слишком долго.
Считывать с формы можно, но если разрешение достаточно большое (1 Мр и более), то форма не помещается в экан и изображение частично режется. К тому же надо сделать экран контроля маленьким, и тогда вообще только малая часть захватывается.
Aleksandr_59 вне форума Ответить с цитированием
Старый 22.03.2012, 12:35   #7
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

Можно как то черезSendMessage поместить в буфер обмена и потом извлечь из него в Bitmap... Кто подскажет, какое сообщение послать вебке для этого (поместить в буфер)?
Aleksandr_59 вне форума Ответить с цитированием
Старый 22.03.2012, 13:10   #8
Aleksandr_59
Пользователь
 
Регистрация: 14.10.2011
Сообщений: 77
По умолчанию

Цитата:
Сообщение от Rin Посмотреть сообщение
Получили картинку на форме, а потом обращайтесь попиксельно:
Код:
 Form1.Canvas.Pixels[i,j].
Этот код у меня даёт на выходе -1. На Image.Canvas переносится чёрный прямоугольник. А операция...

BitBlt(Form2.Image1.Canvas.Handle,
Trunc((Form2.Image1.Width-UnitCam.FormCam.ClientWidth)/2),
Trunc((Form2.Image1.Height-UnitCam.FormCam.ClientHeight)/2),
UnitCam.FormCam.ClientWidth, UnitCam.FormCam.ClientHeight,
hWndDC, 0, 0, SRCCOPY);

...даёт нормальную картинку.
Aleksandr_59 вне форума Ответить с цитированием
Старый 22.03.2012, 17:28   #9
Rin
Негодник
Форумчанин
 
Аватар для Rin
 
Регистрация: 10.11.2009
Сообщений: 880
По умолчанию

Кажется, вы меня не поняли.
Сначала
Цитата:
Код:
BitBlt(Form2.Image1.Canvas.Handle,
Trunc((Form2.Image1.Width-UnitCam.FormCam.ClientWidth)/2),
Trunc((Form2.Image1.Height-UnitCam.FormCam.ClientHeight)/2),
UnitCam.FormCam.ClientWidth, UnitCam.FormCam.ClientHeight,
hWndDC, 0, 0, SRCCOPY);
а потом
Код:
For i:= 1 to Form1.width do
For j:= 1 to Form1.Height do
Image1.canvas.Pixels[i,j]:= Form1.Canvas.Pixels[i,j];
А может я вас не врубаюсь.
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума Ответить с цитированием
Старый 22.03.2012, 20:41   #10
raxp
Старожил
 
Регистрация: 29.09.2009
Сообщений: 9,742
По умолчанию

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

Цитата:
Можно как то черезSendMessage поместить в буфер обмена и потом извлечь из него в Bitmap
зачем же в буфер? Это же трата времени

В обработчике сообщений главного окна после создания назначаем обработчик FrameCallBack:
Код:
var
  DC    : HDC;
  Bt    : BITMAPINFO;
  h_wnd : HWND;
  h_cam : HWND;
  buf   : array [0..640 * 480 * 3] of Byte; // изображение-эталон
...

// создание главного окна приложения
  with wnd do
  begin
    cbSize        := SizeOf(wnd);
    lpfnWndProc   := @WndProc;
  ...

// создание невидимого окна захвата
  h_cam := capCreateCaptureWindowA(nil, WS_CHILD or WS_VISIBLE, 0, 0, 0, 0, h_wnd, 0);
// получаем идентификаторы графического контекста главного окна
  DC  := GetDC(h_wnd);

// настройка драйвера
  if SendMessage(h_cam, WM_CAP_DRIVER_CONNECT, 0, 0) <> 0 then
  begin
    SendMessage(h_cam, WM_CAP_GET_VIDEOFORMAT, SizeOf(Bt), LongInt(@Bt));
    Bt.bmiHeader.biWidth    := 320;
    Bt.bmiHeader.biHeight   := 240;
    Bt.bmiHeader.biSize     := SizeOf(Bt.bmiHeader);
    Bt.bmiHeader.biPlanes   := 1;
    Bt.bmiHeader.biBitCount := 24;
    SendMessage(h_cam, WM_CAP_SET_VIDEOFORMAT, SizeOf(Bt), LongInt(@Bt));
    SendMessage(h_cam, WM_CAP_SET_CALLBACK_FRAME, 0, Integer(@FrameCallback));
  end
...

function WndProc(hwnd: DWORD; message: UINT; wParam: Longint; lParam: LongInt): LongInt; stdcall;
begin
  case message of
 ...
  // получаем кадр по таймеру
    WM_TIMER       : SendMessage(h_cam, WM_CAP_GRAB_FRAME, 0, 0);
  end;
  Result := DefWindowProc(hwnd, message, wParam, lParam);
end;
И сам кадр уже в каллбэке:
Код:
function FrameCallback(hWnd: HWND; lpVHdr: PVIDEOHDR): DWORD; stdcall;
type
  TByteArray = array [0..1] of Byte;
  PByteArray = ^TByteArray;
var
  i, j   : Integer;
  sum    : Single;
  status : TCapStatus;
  str    : string;
begin
  Result := 0;
  // информация о изображении
  SendMessage(hwnd, WM_CAP_GET_STATUS, SizeOf(status), Integer(@status));

// получаем эталон
  if first then
  begin
    Move(lpVHdr^.lpData^, buf, lpVhdr^.dwBytesUsed);
    first := False;
  end;

// вычисление объектов
  for i := 0 to status.uiImageWidth * status.uiImageHeight - 1 do
  begin
    sum := 0;
    for j := 0 to 2 do
      sum := sum + abs(buf[i * 3 + j] - PbyteArray(lpVHdr^.lpData)[i * 3 + j]);
    sum := sum / 3;
    if sum > SENS then
    begin
      PbyteArray(lpVHdr^.lpData)[i * 3 + 0] := (buf[i * 3 + 0] + PbyteArray(lpVHdr^.lpData)[i * 3 + 0]) div 4;
      PbyteArray(lpVHdr^.lpData)[i * 3 + 1] := (buf[i * 3 + 1] + PbyteArray(lpVHdr^.lpData)[i * 3 + 1]) div 4;
      PbyteArray(lpVHdr^.lpData)[i * 3 + 2] := min(buf[i * 3 + 2] + PbyteArray(lpVHdr^.lpData)[i * 3 + 2], 255);
    end else
      for j := 0 to 2 do
        PbyteArray(lpVHdr^.lpData)[i * 3 + j] := buf[i * 3 + j];
  end;

// вывод результата в окно
  bt.bmiHeader.biWidth  := status.uiImageWidth;
  bt.bmiHeader.biHeight := status.uiImageHeight;
  StretchDIBits(DC, 0, 0, 640, 480, 0, 0, status.uiImageWidth, status.uiImageHeight, lpVHdr.lpData, bt, 0, SRCCOPY);

end;
http://programmersforum.ru/showpost....8&postcount=12
Разработки и научно-технические публикации :: Видеоблог :: Твиттер
Radar systems engineer & Software developer of industrial automation
raxp вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изображение из веб-камеры в файл. OmgA Помощь студентам 2 21.03.2012 17:10
Выбор веб камеры kazzz Компьютерное железо 0 26.12.2011 00:16
Выбор веб-камеры Hudishka Компьютерное железо 7 13.01.2011 10:25
Трансляция веб-камеры LevonNikox JavaScript, Ajax 2 29.10.2010 12:58