Добрый день.
Работаю над программой для распознавания номеров с потокового видео(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 и каким-то образом рисует потом уже картинку на своих оверлеях.
Так же посмотрите сюда
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости