Vicul
-
Количество публикаций
43 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем Vicul
-
-
Не понимать ((, переводчик не помог. Скажите пожалуйста по русски.Я понял это так: Размер исходной картинки должен делиться на 2 столько раз, сколько ты имешь уровней в пирамиде, н-р, если 4 уровня, то 4 раза все должно делиться на 2. Иначе ты получишь ошибку, которую трудно диагностировать.
-
Взял из книжки на строке с cvPyrSegmentation выдает ошибку has a bad argument, какие же ей аргументы передовать?В книге есть также следующая ссылка
One important word of warning about src anddst: because all levels of the image pyramid must have integer sizes in both dimensions,
the starting images must be divisible by two as many times as there are levels in the
pyramid. For example, for a four-level pyramid, a height or width of 80 (2 × 2 × 2 × 5)
would be acceptable, but a value of 90 (2 × 3 × 3 × 5) would not.*
*Heed this warning! Otherwise, you will get a totally useless error message and probably waste hours trying to fi gure out what’s going on
-
Единственное что, IPP работать так скорее всего не будет. И MSVCR надо не забыть.С IPP еще не работал, но думаю без этого пакета не обойтись. Поэтому интересно, как вы передаете все это заказчику. Скажем если прога на писана на MSVC++, здесь проблем нет - лицензия моя и все ехе-шники будут легальны. С OpenVC тоже проблем нет - пакет распостраняется свободно. А как быть с IPP? Я слышал, что это пакет уже коммерческий, и заказчику необходимо его покупать? Вопрос с лицензиями у меня один из основных, потому что клиенты у меня "из-за бугра".
-
Сейчас пытаюсь найти какую либо информацию по этому поваду в книге OReilly-LearningOpenCVЕсли кто знает на каких страницах данной книге рассматриваются эти вопросы скажите пожалуйста страници откуда начинать мне переводить ??????
Сам иду тем же путем, и у меня сложилось мнение, что книга написана тяжело и ее надо читать всю - от начала до конца, причем необходимо иметь некоторые знания с высшей математики и матричной алгебры. А не зная теории и браться за какой то кусок работы - пустая трата времени.
-
А если DLL-ки засунуть в инстал-пак приложения и и бросать их в папку приложения при сетапе, никто не пробовал? Или все таки OpenCV требует некоторых изменений в реестре, при установке этого пакета?
-
Всем привет,
прошу прощения за глупый вопрос. Подключить Visual C++ к OpenCV проблем нет, вопрос в другом - предположим, апп готово и его необходимо передать к заказчику, возможно ли сделать статическое апп, которое уже включало в себе все нужные библиотеки OpenCV, т.е. чтобы заказчику не нужно было устанавливать OpenCV? Или все таки необходимо поставлять апп с dll-ками OpenCV?
-
Спасибо за инфу, теперь начало доходить что к чему.
-
За библиотеку спасибо, но хотелось бы посмотреть, как работает 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();
-
Всем привет,
кто-нибудь подкиньте пример с cvDFT(), реально работающий, ну чтобы на входе картинка и на выходе ее результат.
Заранее благодарю.
-
Можно посмотреть что то на подобии Logitech Webcam Pro 9000 (100 $).Thanks, буду ореинтироваться на эту камеру.
-
Делаю первые шаги в CV и стоит вопрос, какую камеру приобрести.
В предыдущем топике поднималась эта тема, но там с темы соскочили.
Поэтому опять ее поднимаю. Хотелось бы, приобрести камеру не только
для обучения, но и в дальнейшем чтобы она была полезна в работе. Я понимаю,
что покупать железо надо для целевого назначения. Но я пока в поисках той области,
где буду работать. Поэтому хотелось бы найти ту "золотую серединку", хотя бы по критерию
цена-качество (до $100). Что можете посоветовать.
-
Вообще-то разница (правое немного размыто) есть:Хрен его знает, избражение почти не меняется, я пытался сравнивать данные в матрицах изображений, вначале все одинаково. Далее идти - можно "резьбу сорвать". Думаю коэф-ты ядер слишком маленькие, чтобы визуально что-то определить. В принципе идея понятна, вопрос закрыт, спасибо за помощь.
-
> float D[] = {1, 2, 1};
Да если поставить эти коэф-ты, то будет что-то меняться, но у меня они дробные.
-
Спасибо за линк, теперь более менее понятно
Вот:Кстати Тут по моему нестыковочка:
for (int x = 0; x < 3; x++)
cvmSet(rgbMat, 0, x, D[x]); // здесь 0,x
for (int i = 0; i < 3; i++)
{
cvZero(dstRGB);
cvFilter2D(rgb, dstRGB, rgbMat, cvPoint(1, 0)); // а якорь здесь cvPoint(1, 0)
}
Помоему здесь все в норьме. 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() должен был изменить изображения. У меня все одиноковое.
-
-
Вот проект вычисления скелета изображения (тема есть на форумеСпасибо за инфу, помоему это единственный форум, где я нашел единомышленников.
С градусными коэффициентами с Вашего проекта у меня все работает (в книге это предыдущее задание).
У меня большие сомнения в моих исходных коэф-тах - [(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".
-
Всем привет,
изучаю пакет 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");
Буду благодарен за любую идею в этом вопросе.
гистограмма изображения
в OpenCV
Опубликовано · Report reply
Ну ты и понакрутил!
IplImage* hist2image() она по идее должна делать две вещи:
1. создавать HSV гистограмму
2. создавать ее имидж.
CvHistogram* image2hist(IplImage *src) создает RGB гистограмму. Причем сразу вопрос - почему ты отбрасываешь B канал ?
и вызывашь hist2image(), которая создает HSV гистограмму (а зачем, если дальше ты работаешь с RGB гистограммами?) и показываешь их как НSV. Так может проще перейти на HSV и не морочиться с RGB?