Прямой эфир


0
#define WIDTHBYTES(bits) (((bits) + 31) / 32 * 4)
HBITMAP CreateRGBBitmap(IplImage* _Grab )
{
    char *App;
    LPBITMAPINFO lpbi = new BITMAPINFO;
    lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    lpbi->bmiHeader.biWidth = _Grab->width;
    lpbi->bmiHeader.biHeight =_Grab->height;
    lpbi->bmiHeader.biPlanes = 1;
    lpbi->bmiHeader.biBitCount = 24;
    lpbi->bmiHeader.biCompression = BI_RGB;
    lpbi->bmiHeader.biSizeImage = WIDTHBYTES((DWORD)_Grab->width * 8) * _Grab->height;
    lpbi->bmiHeader.biXPelsPerMeter = 0;
    lpbi->bmiHeader.biYPelsPerMeter = 0;
    lpbi->bmiHeader.biClrUsed = 0;
    lpbi->bmiHeader.biClrImportant = 0;
    void* pBits;
    HBITMAP hBitmap = CreateDIBSection( NULL,lpbi,DIB_RGB_COLORS,(void **)&pBits,NULL,0 );
    delete lpbi;
    if ( hBitmap ) App=(char*)pBits;
	long int length=0;
    if(_Grab->nChannels==1) // Серое или бинарное
    {
           length = _Grab->width*(_Grab->height);
           for (int i=0;i<_Grab->height;i++)
           {
                   for (int j=0;j<_Grab->width;j++)
                   {
                           App[_Grab->width*3*(_Grab->height-i-1)+j*3]=_Grab->imageData[_Grab->width*(i)+j];
                           App[_Grab->width*3*(_Grab->height-i-1)+j*3+1]=_Grab->imageData[_Grab->width*(i)+j];
                           App[_Grab->width*3*(_Grab->height-i-1)+j*3+2]=_Grab->imageData[_Grab->width*(i)+j];
                   }
           }
    }
    if(_Grab->nChannels==3) // Цветное
    {
           for (int i=0;i<_Grab->height;i++)
           {
                   // Копируем память
                   memcpy(App+_Grab->width*3*(_Grab->height-i-1),_Grab->imageData+_Grab->width*3*i,_Grab->width*3);           
           }
    }	
    return hBitmap;
}
avatar

vidikon

  • 18 января 2014, 11:37
0
4. «Причесывание» проекта
Здесь делается проект более презентабельным.
Во-первых, результаты нужно выдавать в виде лога в специальном текстовом блоке. Для этого в capture делаем глобальную строку char outbuf[256];, которая заполняется следующим образом в функции ImageProcess:
time_t rawtime; 
struct tm * timeinfo; 
time ( &rawtime ); 
timeinfo = localtime ( &rawtime ); 
sprintf( outbuf,"Time and data: %s - Number: %s\n", asctime (timeinfo), res[0] );


Если номер не будет распознан, то значение строки будет пустое. Также делаем функцию, которая будет это значение возвращать:
void GetResult( char* dst )
{
	strcpy_s( dst, 256, outbuf );
}

Вывод на форму в Form.h:
char* s = new char[256];
GetResult( s );
if ( s[0] != 0 ){						 
	 String^ s2;
	 s2 = gcnew String(s);
	 textBox2->AppendText(s2);
 }
delete [] s;

Результат:


Ну и последнее, это делаются поля для ввода логина и пароля. Изменяя можно посмотреть в исходном тексте.
Результат показан на первом слайде.

Заключение
Полный исходный текст программы вы можете найти здесь: http://intbusoft.com/download/IPtest.zip. Программа была написана только для примера, чтобы проиллюстрировать быстроту создания подобного приложения, поэтому присутствуют решения, которые не стоит использовать в реальном программном продукте. При тестировании библиотеке iANPR помните, что FREE версия работает очень медленно, поэтому работа с IP камерой будет с очень серьезными задержками, если вы не настроите камеру на передачу видео чаще 1 раза в 2 секунды. Поэтому для полноценного теста лучше использовать чтение из ранее записанного видеофайла. Платная версия в 32 раза быстрее бесплатной.
avatar

vidikon

  • 18 января 2014, 11:37
0
Просто отслеживаем dx (сильное изменение) и если dx то предполагаем, что это ошибка — в последующих элементах смотрим, есть ли точки с похожими x, если есть то считаем линию между двумя этими точками, а остальные с большим dx заменяем на те, которые подходят по формуле линии
avatar

vidikon

  • 12 апреля 2013, 08:58
0
Подскажите, пожалуйста, каким образом можно удалить сильно отклоняющиеся точки контура?
avatar

somebody

  • 11 апреля 2013, 21:37
0
Да в общем не думаю, чтобы в чем-то было преимущество. Но в данном случае речь идет об использовании Kinect SDK, а не OpenCV. OpenCV просто для того, чтобы картинку выводить — лень было по-другому делать.
avatar

vidikon

  • 22 марта 2013, 15:44
0
А в чем преимущество такого метода перед использованием OpenNI и стандартных средств OpenCV?
Там все короче решается через:
cv::VideoCapture cap(CV_CAP_OPENNI);
cap.grab();
cap.retrieve( depthMap, CV_16UC1 );
cap.retrieve( bgrImage, CV_32FC1 );
Или при таком подходе Depth Map чем-то отличается?
avatar

BelBES

  • 22 марта 2013, 14:52
0
а можно через ptr присвоить цвет компоненте, например
ptr[0] = 255;
ptr[1] = 255;
ptr[2] = 255;
avatar

gora

  • 07 июня 2012, 19:05
0
Ага. Я понял о чем ты :)
avatar

vidikon

  • 01 июня 2012, 13:28
0
Увидел изображение для поиска с шаблоном и вдруг навеяло «автокорелляция»)))))
avatar

kweilin

  • 01 июня 2012, 13:15
0
понятно)спс
uchar* ptr = (uchar*) image->imageData;
long r = ptr[0]; ///<----это будет r-компонента в левом нижнем углу, или в верхнем углу?)) просто немного запутался как строки располагаются в верхние пиксели как бы в начале массива ptr, или в конце
avatar

gora

  • 18 мая 2012, 19:04
0
Это унаследовалось от формата BMP — выравнивание на границу 4 байта, 534 на 4 не делится, поэтому добавляется еще 2 байта.
avatar

vidikon

  • 17 мая 2012, 09:51
0
ага, понял свою ошибку) спс))
image->widthStep = 536(число байт в строке) image->width = 178, 178*3 = 534 не совпадает с widthStep. по какой причине они не совпадают?))
avatar

gora

  • 17 мая 2012, 09:34
0
<0 только одна идея, что ptr unsigned char у вас. Посмотрите в отладке, как изменяются значения.
avatar

vidikon

  • 16 мая 2012, 13:19
0
еще вопрос
r+=ptr[i*Image24->widthStep+j*3];
g+=ptr[i*Image24->widthStep+j*3+1];
b+=ptr[i*Image24->widthStep+j*3+2];
как я понимаю ptr массив пикселей изображения, в котором строки располагаются друг за другом, widthStep длина каждой строки, по приведенной формуле обращаемся к (i,j)элементу, а j*3, j*3+1, j*3+2 — это для каждого пикселя обращаемся к компонентам b,g,r. почему то значения r, g, b -получаются < 0 — тут и запутался(
avatar

gora

  • 16 мая 2012, 08:34
0
Не понял, а это делалось «Какой-то результат есть, но надо убрать эти сильные колебания. После удаления точек (считаем, что точки такого рода с сильным отклонение не значимы), » Я код по этому не приводил.
cvApproxPoly сгладит только слабый шум.
avatar

vidikon

  • 15 мая 2012, 18:07
0
спасибо, немного ясней стало)) при аппроксимации контура, он вообще никак не сглаживается у меня)
avatar

gora

  • 15 мая 2012, 11:10