Почему при подключении к айпи камере нормальную картинку я получаю первые 3-5 секунд. Далее - сплошные артефакты. Пробовал как чистый OpenCV, так и EmguCV. Что вывод в свое окно, что вывод в созданное библиотечкой окно - все одинаково:
Самая верхушка нормально, а ниже - бяка. Ну иногда еще зеленые артефакты бывают. Я поначалу грешил на то, что беру картинку с камеры, проброшенной по ВПН, но нет, в родной сети та же история. Но HVRServer/ILDVR Live Center показывают нормальную картинку. Хотя используют ту же OpenCV (что по ВПН, что в родной сети).
Небольшой набросок кода на шарпе:
Код:
private Emgu.CV.Capture _cap = null;
private Graphics _gtr = null; // холст
private Rectangle _rct; // клиентская область холста
private Bitmap _bmp = null; // картинка от камеры для сохранения и вывода
private void Form1_Load(object sender, EventArgs e)
{
// получаем холст и его клиентскую область
_gtr = this.pictureBox1.CreateGraphics();
_rct = this.pictureBox1.ClientRectangle;
// подключаемся к камере и показываем в заголовке размеры каринки
_cap = new Emgu.CV.Capture(@"rtsp://admin:admin@192.168.40.121:554");
this.Text = string.Format("{0} x {1}", _cap.Width, _cap.Height);
// считаем число кадров в секунду для таймера
int _rate = (int)(1000 / _cap.GetCaptureProperty(Emgu.CV.CvEnum.CapProp.Fps);
// таймер
Timer _tmr = new Timer();
_tmr.Interval = _rate == 0 ? 100 : _rate; // интервал - число кадров в сек.
_tmr.Tag=(object)0; // для имени файла
// срабатывание таймера
_tmr.Tick+=(s, ea) =>
{
lock (this.sync)
{
// читаем картинку и если не вышло - выход из события
Emgu.CV.Mat mt = _cap.QuerySmallFrame();
if (mt == null)
return;
// один раз получаем картинку
_bmp = mt.Bitmap;
// рисуем ее
_gtr.DrawImage(_bmp, _rct);
// сохраняем в файл
int x = (int)_tmr.Tag;
_bmp.Save(string.Format("IMG_{0}.jpg", x),System.Drawing.Imaging.ImageFormat.Jpeg);
x++;
_tmr.Tag = (object)x;
// удаляем полученную картинку
_bmp.Dispose();
}
};
// стартуем таймер
_tmr.Start();
} // private void Form1_Load
Ради эксперимента сбрасываю кадры в файлы... То есть проблема в получении картинки либо в обработке ее самой OpenCV. Может я чего-то недопонял?