Перейти к содержимому
Compvision.ru

Dasdranagon

Пользователи
  • Количество публикаций

    16
  • Зарегистрирован

  • Посещение

Репутация

1 Новичек

О Dasdranagon

  • Звание
    Бывалый
  • День рождения 31.10.1963

Contact Methods

  • Website URL
    http://
  • ICQ
    0

Profile Information

  • Пол
    Мужской
  • Расположение
    Germany, Munich (München)
  1. NEW C++ API Reference

    Привет всем. Кто-нибудь имеет опыт с программированием в "новом" API: C++ API Reference с OpenCV 2.2? У меня такое впечатление, что этот API ещё очень сырой. В нём отсутствуют порой элементарные компоненты, например аналоги cvResizeWindow() и cvMoveWindow(). Приходится "мешать" старый и новый стиль. Очень часто программу нельзя дебагить: релиз пашет, дебаг - нет. (Тот же код в старом API раборает без проблем) Интересны мнения общественности по этому поводу.
  2. opencv 2.2

    Насколько я помню, cvLoadImage имеет 2 аргумента. IplImage* img = cvLoadImage( argv[1], 1 ); Окрывать изображение: 0 - как 1 канальное (серое) 1 - как 3 канальное (цветное)
  3. Работа с камерами

    Спасибо! Буду копать идею № 2. Если чего добьюсь - отпишусь.
  4. Работа с камерами

    Меня интересует именно БИТРЕЙТ, т.е. характерстика сжатия видео. Задача получить AVI как можно меньшего размера при приемлемом качестве. Причём всё должно быть автоматизировано. Можно, конечно, сформировать несжатый AVI, а затем вызывать консольный VirtualDub или mencoder, но это громоздко, занимает много времени и места на диске. Хотелось бы решить задачу поизящнеее...
  5. Работа с камерами

    Привет всем. OpenCV поддерживает некоторые кодеки для записи AVI: 1 - CV_FOURCC('P','I','M','1') = MPEG-1 codec 2 - CV_FOURCC('M','J','P','G') = motion-jpeg codec 3 - CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec 4 - CV_FOURCC('D', 'I', 'V', '3') = MPEG-4.3 codec 5 - CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec 6 - CV_FOURCC('U', '2', '6', '3') = H263 codec 7 - CV_FOURCC('I', '2', '6', '3') = H263I codec 8 - CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec Вопрос: Можно ли как-нибудь управлять битрейтом? Это касается, в частности, кодеков 3, 4 и 5. Из каких соображений выбираются значения битрейта "по умолчанию"? Заранее спасибо!
  6. Работа с камерами

    Да, странно.. В данном случае cvReleaseImage вообще не нужен. После цикла только cvReleaseCapture( &capture ); Ну и не забыть cvDestroyAllWindows();
  7. Работа с камерами

    На первый взгляд ошибка в следующем: Вынеси определение объекта IplImage *img; ДО цикла while. В теле цикла просто: img = cvQueryFrame(capture);
  8. Обратная функция к cvProjectPoints2

    Любой положительный, например 1 и 10. Но, на практике логично выбрать 0 и 1, (для 0 создаём vector <CvPoint2D64f> m0(1) и vector <CvPoint3D64f> M0(1), - состоящие из одного элемента). Тогда получается вектор, направленный из оптического центра камеры M0[0] в направлении M.
  9. Обратная функция к cvProjectPoints2

    Как говориться: "Спасение утопающих..." Ниже привожу решение проблемы. Функция выдаёт 3D точки, соответствующие 2D пикселям. Чтобы получить вектора, надо вызвать эту функцию дважды, с различными значениями z. При z=0 функция вернёт координаты оптического центра камеры. int ProjectImagePixelsTo3D(vector <CvPoint2D64f> m, // Undistorted Image pixels (input) vector <CvPoint3D64f> &M, // Object 3D points (output) double R[], // Rotation matrix [9] (3х3). See cvRodrigues2. double t[], // Translation vector [3] double I[], // Intrinsic matrix [9] double z) // Scaling Factor (for camera origin z=0) { int i,j,l, count; double x,y,fx,fy,cx,cy; CvMat * Kx = cvCreateMat(3,3,CV_64FC1); CvMat * Ky = cvCreateMat(3,1,CV_64FC1); CvMat * KC = cvCreateMat(3,1,CV_64FC1); fx = I[0]; fy = I[4]; cx = I[2]; cy = I[5]; l = 0; for(i = 0;i < 3;i++) for(j = 0;j < 3;j++) cvSetReal2D(Kx,i,j,R[l++]); count =(int) m.size(); for( i = 0; i < count; i++ ) { x = (m[i].x - cx) / fx * z; y = (m[i].y - cy) / fy * z; cvSetReal2D( Ky, 0, 0, x - t[0]); cvSetReal2D( Ky, 1, 0, y - t[1]); cvSetReal2D( Ky, 2, 0, z - t[2]); cvSolve(Kx,Ky,KC,CV_LU); M[i].x = CV_MAT_ELEM( *KC, double, 0,0); M[i].y = CV_MAT_ELEM( *KC, double, 1,0); M[i].z = CV_MAT_ELEM( *KC, double, 2,0); } cvReleaseMat(&Kx); cvReleaseMat(&Ky); cvReleaseMat(&KC); return 0; } [/codebox]
  10. Обратная функция к cvProjectPoints2

    Привет Всем! Уже несколько дней топчусь на месте. Может кто уже встречался с подобной проблемой? OpenCV функция cvProjectPoints2 проецирует заданный 3D point на снимок с камеры, при известных rotation_vector, translation_vector, intrinsic_matrix и distortion_coeffs. Это работает безукоризненно. Необходимо же решить обратную задачу: Есть точка на снимке. Небходимо найти луч (вектор) в 3D пространстве, направленный из камеры в эту точку при тех же rotation_vector, translation_vector, intrinsic_matrix и distortion_coeffs. Система координат та же, что использовалась для cvProjectPoints2. Заранее благодарю за помощь!
  11. MS Visual C++ и OpenCV

    Нужно использовать файл vcredist_x86.exe , который лежит в c:\Programme\Microsoft Visual Studio 8\SDK\v2.0\BootStrapper\Packages\vcredist_x86\ К тому же лучше компилировать OpenCV самому (я, например, компилирую из SVN). На компе без OpenCV нужно скопировать все OpenCV-dll-ки, например, в C:/Windows/System32/ и проинсталлировать вышеназванный vcredist_x86.exe. И усё
  12. Я так понял, что нужно именно РАЗВЕРНУТЬ на 90 градусов картинку, т.е.: *************** ********** * * * * * * => * * * * * * *************** * * * * **********
  13. void cvRotateImage90( IplImage *ImIn, IplImage **ImOut) // +90 Grad { int i,j,k,l,w,h,nC; w = ImIn-> width; h = ImIn-> height; nC = ImIn-> nChannels; *ImOut = cvCreateImage(cvSize(h, w), IPL_DEPTH_8U, nC); uchar * pI = (uchar *) ImIn -> imageData; uchar * pO = (uchar *) (*ImOut) -> imageData; k = 0; for (i=w-1; i >= 0; i--) { for (j=0; j < h; j++) for (l=0; l < nC; l++) *(pO + k++)=*(pI + nC * w * j - nC + l + nC * i); } } void cvRotateImage_90( IplImage *ImIn, IplImage **ImOut) // -90 Grad { int i,j,k,l,w,h,nC; w = ImIn-> width; h = ImIn-> height; nC = ImIn-> nChannels; *ImOut = cvCreateImage(cvSize(h, w), IPL_DEPTH_8U, nC); uchar * pI = (uchar *) ImIn -> imageData; uchar * pO = (uchar *) (*ImOut) -> imageData; k = 0; for (i=0; i < w; i++) { for (j=h-1; j >= 0; j--) for (l=0; l < nC; l++) *(pO + k++)=*(pI + nC * w * j - nC + l + nC * i); } }
  14. Дилетантские вопросы

    I found a nice example to understand what means "widthStep". In case of 3-channel image img->widthStep= ( img->width + 1) * 4 //////////////////////////////////////////////////////////////////////// // // hello-world.cpp // // This is a simple, introductory OpenCV program. The program reads an // image from a file, inverts it, and displays the result. // //////////////////////////////////////////////////////////////////////// #include <stdlib.h> #include <stdio.h> #include <math.h> #include <cv.h> #include <highgui.h> int main(int argc, char *argv[]) { IplImage* img = 0; int height,width,step,channels; uchar *data; int i,j,k; if(argc<2){ printf("Usage: main <image-file-name>\n\7"); exit(0); } img=cvLoadImage(argv[1]); // load an image if(!img){ printf("Could not load image file: %s\n",argv[1]); exit(0); } // get the image data height = img->height; width = img->width; step = img->widthStep; channels = img->nChannels; data = (uchar *)img->imageData; printf("Processing a %dx%d image with %d channels, step= %d\n",height,width,channels,step); // create a window cvNamedWindow("mainWin", CV_WINDOW_AUTOSIZE); cvMoveWindow("mainWin", 100, 100); // invert the image for(i=0;i<height;i++) for(j=0;j<width;j++) for(k=0;k<channels;k++) data[i*step+j*channels+k]=255-data[i*step+j*channels+k]; // show the image cvShowImage("mainWin", img ); // wait for a key cvWaitKey(0); // release the image cvReleaseImage(&img ); return 0; } [/codebox] Source: http://www.cs.iit.edu/~agam/cs512/lect-not...encv-intro.html
  15. Дилетантские вопросы

    Sorry, i havn't russian keyboard now. Try to understand follows: The other trick to know is that the step element in the matrix array is the length in bytes of a row in the matrix. In that structure, cols or width alone is not enough to move between matrix rows because, for machine efficiency, matrix or image allocation is done to the nearest four-byte boundary. Thus a matrix of width three bytes would be allocated four bytes with the last one ignored. For this reason, if we get a byte pointer to a data element then we add step to the pointer in order to step it to the next row directly below our point. If we have a matrix of integers or floating-point numbers and corresponding int or float pointers to a data element, we would step to the next row by adding step/4; for doubles, we’d add step/8 (this is just to take into account that C will automatically multiply the offsets we add by the data type’s byte size).
×