Технический форум по робототехнике.
Angel71 » 08 фев 2010, 04:57
flyroman, да дело не в том, что vlc в принципе не подходит. как вариант вполне можно использовать. вот смотри, ты пробовал получать цвет пикселей, но реально на всём канвасе у тебя всё было залито одним цветом. а эт значит только одно - оверлей и до самого изображения всякими getpixel ну никак не доберёшся. для этого тебе нужно будет писать "фильтр". а там не всё так просто и легко, смысл в это всё лезть? эт первое и основное.
второе. вообще по нормальному нельзя работать с данными, получаемых попиксельно из канваса. каждый вызов getpixel или чего-то аналогичного это оооооооооооооооочень много лишних телодвижений, начиная с того, что это уже вызов функции, заканчивая тем, что эта функция сама по себе делает много ненужных телодвижений.
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 и произвести нужные преобразования.
flyroman » 08 фев 2010, 17:09
Так, от VLC я отказался, в силу того что нашел код нормального приема с видеоустройств.
код как раз для VB.
1. Принимает очень быстро картинка не тормозит.
2. Можно считать пиксели.
Angel71 » 08 фев 2010, 17:51
именно код или какая-то библиотека с примерами кода?

делись, может кому тоже згодится
Michael_K » 08 фев 2010, 18:25
ссылочку хотя бы?
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
Michael_K » 08 фев 2010, 19:58
Можно рам-диск юзать

))
Добавлено спустя 12 минут 30 секунд:http://bit.pirit.info/forum/viewtopic.php?t=7436&highlight=
flyroman » 08 фев 2010, 22:17
Michael_K, отдуши спасибо за ссылку!