Форум программистов  
Главная  |  Правила форума  |  Исходники Delphi  |  Основы Delphi  |  Блог программистов  |  Рассылка  |  Повторная активизация e-mail  | 

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



О проблемах с регистрацией и почтой пишите сюда - post@programmersforum.ru, по необходимости будем регистрировать вручную. И проверяйте папку спам!



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

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

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

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

Для сохранения 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 в 11:11.
raxp вне форума   Ответить с цитированием
Старый 22.03.2012, 11:13   #5
Rin
Негодник
Участник клуба
 
Аватар для Rin
 
Регистрация: 10.11.2009
Адрес: сергиев посад
Сообщений: 873
Репутация: 170
По умолчанию

Получили картинку на форме, а потом обращайтесь попиксельно:
Код:

 Form1.Canvas.Pixels[i,j].

__________________
Если помог, проси поставить минус. Будь оригинален!
Rin вне форума   Ответить с цитированием
Старый 22.03.2012, 11:30   #6
Aleksandr_59
Форумчанин
 
Регистрация: 14.10.2011
Сообщений: 63
Репутация: 10
По умолчанию

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

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

Цитата:
Сообщение от 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, 16:28   #9
Rin
Негодник
Участник клуба
 
Аватар для Rin
 
Регистрация: 10.11.2009
Адрес: сергиев посад
Сообщений: 873
Репутация: 170
По умолчанию

Кажется, вы меня не поняли.
Сначала
Цитата:
Код:

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, 19:41   #10
raxp
Профессионал
 
Регистрация: 29.09.2009
Сообщений: 9,747
Репутация: 2979
По умолчанию

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

Цитата:
Можно как то через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 вне форума   Ответить с цитированием
Ответ


Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Изображение из веб-камеры в файл. OmgA Помощь студентам 2 21.03.2012 16:10
Выбор веб камеры kazzz Железо 0 25.12.2011 23:16
Выбор веб-камеры Hudishka Железо 7 13.01.2011 10:25
Трансляция веб-камеры LevonNikox Javascript и другие клиентские скрипты 2 29.10.2010 11:58




09:22.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.

Forex с Admiral Markets — это надежно


Работа на Forex с 2000 года. Очное и дистанционное обучение. Выгодные условия.
магазин горящих туров


более 1000 горящих предложений ежедневно
Бэбиблог - соц сеть для будущих мам


RusProfile.ru


Справочник российских юридических лиц и организаций.