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

Vicul

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

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

  • Посещение

Сообщения, опубликованные пользователем Vicul


  1. Ну ты и понакрутил!

    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?


  2. Не понимать ((, переводчик не помог. Скажите пожалуйста по русски.

    Я понял это так: Размер исходной картинки должен делиться на 2 столько раз, сколько ты имешь уровней в пирамиде, н-р, если 4 уровня, то 4 раза все должно делиться на 2. Иначе ты получишь ошибку, которую трудно диагностировать.


  3. Взял из книжки на строке с cvPyrSegmentation выдает ошибку has a bad argument, какие же ей аргументы передовать?

    В книге есть также следующая ссылка

    One important word of warning about src and

    dst: 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


  4. Единственное что, IPP работать так скорее всего не будет. И MSVCR надо не забыть.

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


  5. Сейчас пытаюсь найти какую либо информацию по этому поваду в книге OReilly-LearningOpenCV

    Если кто знает на каких страницах данной книге рассматриваются эти вопросы скажите пожалуйста страници откуда начинать мне переводить ??????

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


  6. А если DLL-ки засунуть в инстал-пак приложения и и бросать их в папку приложения при сетапе, никто не пробовал? Или все таки OpenCV требует некоторых изменений в реестре, при установке этого пакета?


  7. Всем привет,

    прошу прощения за глупый вопрос. Подключить Visual C++ к OpenCV проблем нет, вопрос в другом - предположим, апп готово и его необходимо передать к заказчику, возможно ли сделать статическое апп, которое уже включало в себе все нужные библиотеки OpenCV, т.е. чтобы заказчику не нужно было устанавливать OpenCV? Или все таки необходимо поставлять апп с dll-ками OpenCV?


  8. За библиотеку спасибо, но хотелось бы посмотреть, как работает 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();


  9. Делаю первые шаги в CV и стоит вопрос, какую камеру приобрести.

    В предыдущем топике поднималась эта тема, но там с темы соскочили.

    Поэтому опять ее поднимаю. Хотелось бы, приобрести камеру не только

    для обучения, но и в дальнейшем чтобы она была полезна в работе. Я понимаю,

    что покупать железо надо для целевого назначения. Но я пока в поисках той области,

    где буду работать. Поэтому хотелось бы найти ту "золотую серединку", хотя бы по критерию

    цена-качество (до $100). Что можете посоветовать.


  10. Вообще-то разница (правое немного размыто) есть:

    Хрен его знает, избражение почти не меняется, я пытался сравнивать данные в матрицах изображений, вначале все одинаково. Далее идти - можно "резьбу сорвать". Думаю коэф-ты ядер слишком маленькие, чтобы визуально что-то определить. В принципе идея понятна, вопрос закрыт, спасибо за помощь.


  11. Спасибо за линк, теперь более менее понятно

    Вот:

    Кстати Тут по моему нестыковочка:

    		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() должен был изменить изображения. У меня все одиноковое.


  12. Вот проект вычисления скелета изображения (тема есть на форуме

    Спасибо за инфу, помоему это единственный форум, где я нашел единомышленников.

    С градусными коэффициентами с Вашего проекта у меня все работает (в книге это предыдущее задание).

    У меня большие сомнения в моих исходных коэф-тах - [(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".


  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");

    Буду благодарен за любую идею в этом вопросе.

×