roboforum.ru

Технический форум по робототехнике.

Как обработать видео.

Re: Как обработать видео.

Angel71 » 08 фев 2010, 04:57

flyroman, да дело не в том, что vlc в принципе не подходит. как вариант вполне можно использовать. вот смотри, ты пробовал получать цвет пикселей, но реально на всём канвасе у тебя всё было залито одним цветом. а эт значит только одно - оверлей и до самого изображения всякими getpixel ну никак не доберёшся. для этого тебе нужно будет писать "фильтр". а там не всё так просто и легко, смысл в это всё лезть? эт первое и основное.
второе. вообще по нормальному нельзя работать с данными, получаемых попиксельно из канваса. каждый вызов getpixel или чего-то аналогичного это оооооооооооооооочень много лишних телодвижений, начиная с того, что это уже вызов функции, заканчивая тем, что эта функция сама по себе делает много ненужных телодвижений.

Re: Как обработать видео.

MiBBiM » 08 фев 2010, 08:19

второй заход:
viewtopic.php?f=51&t=6860 - Emgu CV - opencv на vb с помощью .net
туторы:
viewtopic.php?f=51&t=6395#p113373, viewtopic.php?f=51&t=6395&start=30#p146462
граб видео через opencv:
Код: Выделить всёРазвернуть
/*
* Программа захватывает видео с камеры
* Для выхода используется клавиша e
*/
#include <highgui.h>
#include <stdio.h>

int main()
{
   // создаем окошко для манипуляций
   const char *window = "Тестовое окно";   
   cvNamedWindow(window);

   // буфер-кадр
   IplImage *img;
   // создаем поток для видео
   CvCapture *camera = cvCreateCameraCapture(CV_CAP_ANY);

   do {
      img = cvQueryFrame(camera);
      cvShowImage(window, img);
   } while (cvWaitKey(33) != 'e');

   cvDestroyAllWindows();
}

готовый кадр захватывается одной функцией и ничего придумывать не надо. да, opencv прекрасно работает с тюнерами.
если так хочется делать захват через сторонние либы - пожалуйста, но только никак не getpixel'om, а получением указателя(1) на сграбленное изображение.
после чего нужно создать хидер для изображения и натравить указатель данных из структуры на указатель (1). три строчки
Код: Выделить всёРазвернуть
char *ptr;   // указатель на начало сграбленного изображения
IplImage *frame = cvCreateImage(cvSize(640, 480),IPL_DEPTH_8U, 3);   // хидер
frame->imageData = ptr;   // привязали данные


Добавлено спустя 1 минуту 10 секунд:
если в библиотеке захвата изображение хранится не попиксельно, то нужно будет создать CvMat и произвести нужные преобразования.

Re: Как обработать видео.

flyroman » 08 фев 2010, 17:09

Так, от VLC я отказался, в силу того что нашел код нормального приема с видеоустройств.
код как раз для VB.

1. Принимает очень быстро картинка не тормозит.
2. Можно считать пиксели.

Re: Как обработать видео.

Angel71 » 08 фев 2010, 17:51

именно код или какая-то библиотека с примерами кода? :oops: делись, может кому тоже згодится

Re: Как обработать видео.

Michael_K » 08 фев 2010, 18:25

ссылочку хотя бы?

Re: Как обработать видео.

flyroman » 08 фев 2010, 19:28

Захват видео с устройств.
Код для Visual Basic 6.0
Используется библиотека avicap32.dll

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

Код: Выделить всёРазвернуть
Option Explicit

Const WM_USER = 1024
Const WM_CAP_DRIVER_CONNECT = WM_USER + 10
Const WM_CAP_SET_PREVIEW = WM_USER + 50
Const WM_CAP_SET_PREVIEWRATE = WM_USER + 52
Const WM_CAP_DRIVER_DISCONNECT = WM_USER + 11
Const WM_CAP_GRAB_FRAME = WM_USER + 60
Const WM_CAP_FILE_SAVEDIB = WM_USER + 25

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal HWND As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Function SendMessageString Lib "user32" Alias "SendMessageA" (ByVal HWND As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As String) As Long
Private Declare Function capCreateCaptureWindow Lib "avicap32.dll" Alias "capCreateCaptureWindowA" (ByVal a As String, ByVal b As Long, ByVal c As Integer, ByVal d As Integer, ByVal e As Integer, ByVal f As Integer, ByVal g As Long, ByVal h As Integer) As Long
Private Declare Function capGetDriverDescription Lib "avicap32" Alias "capGetDriverDescriptionA" (ByVal wDriverIndex As Long, ByVal lpszName As String, ByVal cbName As Long, ByVal lpszVer As String, ByVal cbVer As Long) As Long

Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Dim hWDC As Long
Dim STARTcap As Boolean
Dim i, j, k, i2, j2 As Integer
Dim c, f, h As Long

Private Sub Command1_Click()
hWDC = capCreateCaptureWindow("VideoCapture", 0, 0, 0, 320, 240, Picture1.HWND, 0)
  If (hWDC <> 0) Then
    SendMessage hWDC, WM_CAP_DRIVER_CONNECT, 0, 0
     STARTcap = True
     Timer1.Enabled = True
   Else
    MsgBox ("no cam found")
  End If
End Sub


Private Sub Command2_Click()
If STARTcap = True Then
Call SendMessage(hWDC, WM_CAP_DRIVER_DISCONNECT, 0, 0)
STARTcap = False
End If
End Sub

Private Sub Form_Terminate()
f = 10000
i2 = 0
j2 = 0
Picture1.ScaleMode = vbPixels
Timer1.Enabled = False
If STARTcap = True Then
Call SendMessage(hWDC, WM_CAP_DRIVER_DISCONNECT, 0, 0)
STARTcap = False
End If
End Sub

Private Sub Form_Unload(Cancel As Integer)
Timer1.Enabled = False
If STARTcap = True Then
Call SendMessage(hWDC, WM_CAP_DRIVER_DISCONNECT, 0, 0)
STARTcap = False
End If
End Sub

Private Sub Timer1_Timer()
On Error GoTo 1
    SendMessage hWDC, WM_CAP_GRAB_FRAME, 0, 0
    SendMessageString hWDC, WM_CAP_FILE_SAVEDIB, 0, App.Path & "\VIDEO1.BMP"
    Picture1.Picture = LoadPicture(App.Path & "\VIDEO1.BMP")

    DoEvents
1:
End Sub

Re: Как обработать видео.

Michael_K » 08 фев 2010, 19:58

Можно рам-диск юзать :)))

Добавлено спустя 12 минут 30 секунд:
http://bit.pirit.info/forum/viewtopic.php?t=7436&highlight=

Re: Как обработать видео.

flyroman » 08 фев 2010, 22:17

Michael_K, отдуши спасибо за ссылку!


cron
Rambler\'s Top100 Mail.ru counter