Получение отображаемого изображения в PictureBox WindowsForms

167
12 января 2018, 22:48

Добрый день.

Работаю над программой для распознавания номеров с потокового видео(IP камер). Камеры используются фирмы Hikvision, соответственно для получения видео с камеры используется SDK(думаю, для решения вопроса версия не важна).

Есть метод int NET_DVR_RealPlay_V40(int iUserID, ref NET_DVR_PREVIEWINFO lpPreviewInfo, REALDATACALLBACK fRealDataCallBack_V30, IntPtr pUser) где iUserID - ИД залогиненого на камере пользователя, NET_DVR_PREVIEWINFO - структура с параметрами, REALDATACALLBACK fRealDataCallBack_V30 - не используется, IntPtr pUser - не понятно что нужно туда передавать. У меня передается IntPtr.Zero

Сама структура

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct NET_DVR_PREVIEWINFO
{
        public Int32 lChannel; // Номер канала
        public uint dwStreamType; // тип потока , 0-основной поток, 1 - суб поток, 2 - суб поток , 3 - суб поток.
        public uint dwLinkMode; // 0: TCP, 1: UDP, 2: MULTICAST, 3 - RTP, 4-RTP/RTSP, 5 - RSTP/HTTP
        public IntPtr hPlayWnd; //"HCNetSDK.dll" хендл окна воспроизведения, NULL означает, что изображение не воспроизводится
        public bool bBlocked; // 0-неблокирующий доступ, 1-блокирующий доступ. Если блокируется отказ внутреннего подключения SDK, будет возвращен 5 секунд для возврата, что не подходит для опроса.
        public bool bPassbackRecord; //"HCNetSDK.dll" 0 - не включать воспроизведение видео, 1 - включить воспроизведение видео
        public byte byPreviewMode; // Режим предварительного просмотра, 0-нормальный просмотр, 1 предварительный просмотр с задержкой
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = STREAM_ID_LEN, ArraySubType = UnmanagedType.I1)]
        public byte[] byStreamID; // Этот идентификатор включен, когда lChannel равен 0xffffffff
        public byte byProtoType; // протокол прикладного уровня, 0 - частный протокол, протокол 1-RTSP
        [MarshalAsAttribute(UnmanagedType.ByValArray, SizeConst = 222, ArraySubType = UnmanagedType.I1)]
        public byte[] byRes;
 }

Медленно подходим к сути вопроса.

В коде, старт воспроизведения выглядит так(это вырезка из метода) :

CHCNetSDK.NET_DVR_PREVIEWINFO lpPreviewInfo = new CHCNetSDK.NET_DVR_PREVIEWINFO();
lpPreviewInfo.hPlayWnd = Handle; //Handle - хендл PictureBox с формы, передаваемый в метод через аргумент
lpPreviewInfo.dwStreamType = 1;
pPreviewInfo.dwLinkMode = 0;
lpPreviewInfo.bBlocked = true;
//Start live view 
m_lRealHandle = CHCNetSDK.NET_DVR_RealPlay_V40(m_lUserID, ref lpPreviewInfo, null/*RealData*/, IntPtr.Zero);

После выполнения метода в PictureBox'е на форме начинает транслироваться видео. Да да, это все еще предыстория :) c отображением видео у меня все в порядке.

С этого видео транслируемого на форму мне нужно распознать ГРН ТС(номер машины). Для распознавания используется библиотека от компании OOO "MegaPixel"(MPixel) она платная, но не суть. Ознакомился с описанием, разобрался что да как там. Проинициализировал SDK, задал параметры канала, задал параметры распознавания и т.д. Далее нужно использовать метод поиска зон с гос номерами Int32 CFCHRun(int Channel, IntPtr imgbuf, Int32 flag); В этот метод 2ым параметром нужно передать указатель на контрол в котором идет отображение видео. При указании хендла моего PictureBox этот метод ничего не находит в нем. Cвойство image у моего PictureBox пустое.

Bitmap savedBit = new Bitmap(RealPlayWnds.Width, RealPlayWnds.Height);
RealPlayWnds.DrawToBitmap(savedBit, RealPlayWnds.ClientRectangle);
savedBit.Save(@"D:\123.bmp");

Так тоже ничего не сохраняет, точнее сохраняет, но картинка чисто черная. Вот и встает вопрос как мне получить картинку из моего PictureBox и отдать далее на обработку? Я так понял, SDK от камеры использует Native API и каким-то образом рисует потом уже картинку на своих оверлеях.

Answer 1
  1. Почему именно PictureBox, пробовали использовать другой контрол?
  2. Aforge рассматривали? Очень удобно работает, как с потоковым видео, так и с http-потоком.

Так же посмотрите сюда

READ ALSO
Умные алгоритмы поиска в базе данных (asp.net)

Умные алгоритмы поиска в базе данных (asp.net)

Есть сущность товараОдин товар может иметь много названий (на разных языках)

176
Javascript, поиск плагинов [требует правки]

Javascript, поиск плагинов [требует правки]

Кто нибудь видел подобные слайдеры, или плагины, киньте ссылку пжлст

198
Javascript. Формат времени

Javascript. Формат времени

Добрый деньБьюсь, не могу отобразить время в нужном формате: Нужно так - 2018-01-05T21:02:46

191
Как поставить событие на video, когда видео находится в iframe?

Как поставить событие на video, когда видео находится в iframe?

Я понял, что iframe "изолирован от document"Допустим на Youtube есть все возможные API

220