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

Vicul

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

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

  • Посещение

Все публикации пользователя Vicul

  1. Как нарисовать CvBox2D

    Вообще то это структура typdef struct { CvPoint2D32f center; CvSize2D32f size; float angle; } CvBox2D; Или я что-то пропустил?
  2. гистограмма изображения

    А что делает по твоему image2hist(IplImage *src)?
  3. гистограмма изображения

    Ну ты и понакрутил! IplImage* hist2image() она по идее должна делать две вещи: 1. создавать HSV гистограмму 2. создавать ее имидж. CvHistogram* image2hist(IplImage *src) создает RGB гистограмму. Причем сразу вопрос - почему ты отбрасываешь B канал ? int hist_size[] = {200, 200}; // ??? int hist_size[] = {200, 200, 200} .... hist = cvCreateHist(2, hist_size, CV_HIST_ARRAY, ranges, 1); // ???? hist = cvCreateHist(3, hist_size, CV_HIST_ARRAY, ranges, 1); теперь ты создаешь RGB гистограммы CvHistogram* hist1 = image2hist(src1); CvHistogram* hist2 = image2hist(src2); и вызывашь hist2image(), которая создает HSV гистограмму (а зачем, если дальше ты работаешь с RGB гистограммами?) и показываешь их как НSV. Так может проще перейти на HSV и не морочиться с RGB?
  4. Я понял это так: Размер исходной картинки должен делиться на 2 столько раз, сколько ты имешь уровней в пирамиде, н-р, если 4 уровня, то 4 раза все должно делиться на 2. Иначе ты получишь ошибку, которую трудно диагностировать.
  5. В книге есть также следующая ссылка
  6. MS Visual C++ и OpenCV

    С IPP еще не работал, но думаю без этого пакета не обойтись. Поэтому интересно, как вы передаете все это заказчику. Скажем если прога на писана на MSVC++, здесь проблем нет - лицензия моя и все ехе-шники будут легальны. С OpenVC тоже проблем нет - пакет распостраняется свободно. А как быть с IPP? Я слышал, что это пакет уже коммерческий, и заказчику необходимо его покупать? Вопрос с лицензиями у меня один из основных, потому что клиенты у меня "из-за бугра".
  7. Распознавание лиц

    Сам иду тем же путем, и у меня сложилось мнение, что книга написана тяжело и ее надо читать всю - от начала до конца, причем необходимо иметь некоторые знания с высшей математики и матричной алгебры. А не зная теории и браться за какой то кусок работы - пустая трата времени.
  8. MS Visual C++ и OpenCV

    А если DLL-ки засунуть в инстал-пак приложения и и бросать их в папку приложения при сетапе, никто не пробовал? Или все таки OpenCV требует некоторых изменений в реестре, при установке этого пакета?
  9. Спасибо за инфу, теперь начало доходить что к чему.
  10. За библиотеку спасибо, но хотелось бы посмотреть, как работает cvDFT() для обучения. В книге по OpenCV есть пример, но я его не могу понять как его в реальности применить. Пытался сделать, как я его понимаю, в результате получил черное пятно в белой рамке. Поэтому хочу посмотреть живой пример для этой функции. На всякий случай привожу свой код, может кто подскажет, где я неправ. /* Take the Fourier transform of a small Gaussian distribution and the Fourier transform of an image. Multiply them and take the inverse Fourier transform of the results. What have you achieved? As the filters get bigger, you will find that working in the Fourier space is much faster than in the normal space. */ IplImage* img = cvLoadImage("Img17.jpeg"); IplImage* dst = cvCreateImage(cvSize(2*img->width -1, 2*img->height -1), IPL_DEPTH_32F, 1); IplImage* dst2 = cvCreateImage(cvSize(2*img->width -1, 2*img->height -1), IPL_DEPTH_8U, 1); cvZero(dst); cvZero(dst2); cvNamedWindow("Img", 0); cvShowImage("Img", img); //sobel IplImage* gauss = cvCloneImage(img); cvZero(gauss); cvSmooth(img, gauss, CV_GAUSSIAN, 3); cvNamedWindow("Gauss", 0); cvShowImage("Gauss", gauss); //fourier img IplImage* img2 = cvCreateImage(cvSize(img->width, img->height), IPL_DEPTH_32F, 3); cvZero(img2); cvConvertScale(img, img2); cvReleaseImage(&img); IplImage* img3 = cvCreateImage(cvSize(img2->width, img2->height), img2->depth, 1); cvSplit(img2, img3, NULL, NULL, NULL); cvReleaseImage(&img2); int dft_M = cvGetOptimalDFTSize(2 * img3->height -1); int dft_N = cvGetOptimalDFTSize(2 * img3->width -1); CvMat tmp; CvMat* dft_img = cvCreateMat(dft_M, dft_N, CV_32FC1); cvGetSubRect(dft_img, &tmp, cvRect(0, 0, img3->width, img3->height)); cvCopy(img3, &tmp); cvGetSubRect(dft_img, &tmp, cvRect(img3->width, 0, dft_img->cols-img3->width, img3->height)); cvZero(&tmp); cvDFT(dft_img, dft_img, CV_DXT_FORWARD, img3->height); cvReleaseImage(&img3); cvNamedWindow("Fourier_img", 0); cvShowImage("Fourier_img", dft_img); //fourier gaussian IplImage* gauss2 = cvCreateImage(cvSize(gauss->width, gauss->height), IPL_DEPTH_32F, gauss->nChannels); cvZero(gauss2); cvConvertScale(gauss, gauss2); cvReleaseImage(&gauss); IplImage* gauss3 = cvCreateImage(cvSize(gauss2->width, gauss2->height), gauss2->depth, 1); cvSplit(gauss2, gauss3, NULL, NULL, NULL); cvReleaseImage(&gauss2); CvMat* dft_gauss = cvCreateMat(dft_M, dft_N, CV_32FC1); cvGetSubRect(dft_gauss, &tmp, cvRect(0, 0, gauss3->width, gauss3->height)); cvCopy(gauss3, &tmp); cvGetSubRect( dft_gauss, &tmp, cvRect(gauss3->width, 0, dft_gauss->width-gauss3->width, gauss3->height)); cvZero(&tmp); cvDFT(dft_gauss, dft_gauss, CV_DXT_FORWARD, gauss3->height); cvReleaseImage(&gauss3); cvNamedWindow("Fourier_gauss", 0); cvShowImage("Fourier_gauss", dft_img); //mul cvMulSpectrums(dft_img, dft_gauss, dft_gauss, CV_DXT_FORWARD); cvDFT(dft_gauss, dft_gauss, CV_DXT_INV_SCALE, dst->height); cvGetSubRect(dft_gauss, &tmp, cvRect(0, 0, dst->width, dst->height)); cvCopy(&tmp, dst); cvReleaseMat(&dft_gauss); cvReleaseMat(&dft_img); // cvConvertScale(dst, dst2); cvNamedWindow("Fourier", 0); cvShowImage("Fourier", dst); cvReleaseImage(&dst); cvReleaseImage(&dst2); cvWaitKey(0); cvDestroyAllWindows();
  11. Thanks, буду ореинтироваться на эту камеру.
  12. Делаю первые шаги в CV и стоит вопрос, какую камеру приобрести. В предыдущем топике поднималась эта тема, но там с темы соскочили. Поэтому опять ее поднимаю. Хотелось бы, приобрести камеру не только для обучения, но и в дальнейшем чтобы она была полезна в работе. Я понимаю, что покупать железо надо для целевого назначения. Но я пока в поисках той области, где буду работать. Поэтому хотелось бы найти ту "золотую серединку", хотя бы по критерию цена-качество (до $100). Что можете посоветовать.
  13. Всем привет, изучаю пакет OpenCV по книге О'Релли "OpenCV..." и не могу сделать одно упражнение ***************** Separable kernels. Create a 3-by-3 Gaussian kernel using rows [(1/16, 2/16, 1/16), (2/16, 4/16, 2/16), (1/16, 2/16, 1/16)] and with anchor point in the middle. a. Run this kernel on an image and display the results. b. Now create two one-dimensional kernels with anchors in the center: one going “across” (1/4, 2/4, 1/4), and one going down (1/4, 2/4, 1/4). Load the same original image and use cvFilter2D() to convolve the image twice, once with the first 1D kernel and once with the second 1D kernel. Describe the results. ************************ я сделал три этих фильтра, но они не меняют исходное изображение, уже сижу третий день не могу найти где ошибка. Вот мой код IplImage* src = cvLoadImage("4.jpg"); cvNamedWindow("src", 1); cvShowImage("src", src); IplImage* rgb[3]; float L45[]={ 1./16., 2./16., 1./16., 2./16., 4./16., 2./16., 1./16., 2./16., 1./16.};// CvMat* rgbMat = cvCreateMat(3, 3, CV_32FC1); for (int y = 0; y < 3; y++) { for (int x = 0; x < 3; x++) cvmSet(rgbMat, y, x, L45[y*3 + x]); } IplImage* dst = cvCreateImage(cvSize(src->width, src->height), src->depth, 3); IplImage* dstRGB[3]; for (int i = 0; i < 3; i++) { rgb = cvCreateImage(cvSize(src->width, src->height), src->depth, 1); dstRGB = cvCreateImage(cvSize(src->width, src->height), src->depth, 1); } cvSplit(src, rgb[0], rgb[1], rgb[2], NULL); for (int i = 0; i < 3; i++) { cvFilter2D(rgb, dstRGB, rgbMat); } cvReleaseMat(&rgbMat); cvMerge(dstRGB[0], dstRGB[1], dstRGB[2], NULL, dst); cvNamedWindow("dst", 1); cvShowImage("dst", dst); //across float D[] = {1./4., 2./4., 1./4.}; rgbMat = cvCreateMat(1, 3, CV_32FC1); for (int x = 0; x < 3; x++) cvmSet(rgbMat, 0, x, D[x]); for (int i = 0; i < 3; i++) { cvZero(dstRGB); cvFilter2D(rgb, dstRGB, rgbMat, cvPoint(1, 0)); } cvReleaseMat(&rgbMat); cvZero(dst); cvMerge(dstRGB[0], dstRGB[1], dstRGB[2], NULL, dst); cvNamedWindow("Across", 1); cvShowImage("Across", dst); //down rgbMat = cvCreateMat(3, 1, CV_32FC1); for (int y = 0; y < 3; y++) cvmSet(rgbMat, y, 0, D[y]); for (int i = 0; i < 3; i++) { cvZero(dstRGB); cvFilter2D(rgb, dstRGB, rgbMat, cvPoint(0, 1)); } cvReleaseMat(&rgbMat); cvZero(dst); cvMerge(dstRGB[0], dstRGB[1], dstRGB[2], NULL, dst); cvNamedWindow("Down", 1); cvShowImage("Down", dst); cvReleaseImage(&dst); for (int i = 0; i < 3; i++) { cvReleaseImage(&rgb); cvReleaseImage(&dstRGB); } cvWaitKey(0); cvReleaseImage(&src); cvDestroyWindow("src"); cvDestroyWindow("dst"); cvDestroyWindow("Across"); cvDestroyWindow("Down"); Буду благодарен за любую идею в этом вопросе.
  14. Хрен его знает, избражение почти не меняется, я пытался сравнивать данные в матрицах изображений, вначале все одинаково. Далее идти - можно "резьбу сорвать". Думаю коэф-ты ядер слишком маленькие, чтобы визуально что-то определить. В принципе идея понятна, вопрос закрыт, спасибо за помощь.
  15. > float D[] = {1, 2, 1}; Да если поставить эти коэф-ты, то будет что-то меняться, но у меня они дробные.
  16. Спасибо за линк, теперь более менее понятно Помоему здесь все в норьме. cvmSet() берет вторым параметром ряды y (у нас их 1, нулевой)и три значения столбцов x. Ну а якорь идет по определению CvPoint(int x, int y), т.е (1,0) указывает на центр . В принципе его можно не указывать, оставить по умолчанию, это я уже потом его прилепил для успокоения совести. Ладно, вопрос остается, почему все эти три фильтра не меняют картинку? Т.е, 1. Пропускаем через cvFilter2D(src, ... ) матрицу [(1/16, 2/16, 1/16), (2/16, 4/16, 2/16), (1/16, 2/16, 1/16)]. Допустим эта матрица ничего не меняет. 2. Тогда используем через cvFilter2D(src, ... ) одноядерную матрицу по горизонтале (1/4, 2/4, 1/4). Должно же что-то поменяться? 3. А вот теперь если пропустить через полученный результат вертикальную матрицу мы должны получить результат для п.1., ведь если перемножить две одноядеорные матрицы, то мы получим первый фильтр. Резюмирую. Хоть в одном из трех случаев cvFilter2D() должен был изменить изображения. У меня все одиноковое.
  17. Линк у меня не работает, можно повторить.
  18. Спасибо за инфу, помоему это единственный форум, где я нашел единомышленников. С градусными коэффициентами с Вашего проекта у меня все работает (в книге это предыдущее задание). У меня большие сомнения в моих исходных коэф-тах - [(1/16, 2/16, 1/16), (2/16, 4/16, 2/16), (1/16, 2/16, 1/16)] и (1/4, 2/4, 1/4). Я их тупо впихиваю в матрицу. Интуиция мне подсказывает здесь необходима дополнительная обработка, ведь не зря они написали "Separable kernels".
×