Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
snowleo
14 / 0 / 0
Регистрация: 17.06.2014
Сообщений: 15
#1

Opencv-gabor filter не сохраняет результирующую картинку - C++

19.11.2014, 01:42. Просмотров 494. Ответов 1
Метки нет (Все метки)

Здравствуйте. Мне необходим фильтр Габора. Нашел реализацию в инете, но не получается сохранить результат. Т.е. картинка то сохраняется, но она просто заполнена черным цветом.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#include "stdafx.h"
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <math.h>
 
      cv::Mat mkKernel(int ks, double sig, double th, double lm, double ps)
      {
          int hks = (ks-1)/2;
          double theta = th*CV_PI/180;
          double psi = ps*CV_PI/180;
          double del = 2.0/(ks-1);
          double lmbd = lm;
          double sigma = sig/ks;
          double x_theta;
          double y_theta;
          cv::Mat kernel(ks,ks, CV_32F);
          for (int y=-hks; y<=hks; y++)
          {
              for (int x=-hks; x<=hks; x++)
              {
                  x_theta = x*del*cos(theta)+y*del*sin(theta);
                  y_theta = -x*del*sin(theta)+y*del*cos(theta);
                  kernel.at<float>(hks+y,hks+x) = (float)exp(-0.5*(pow(x_theta,2)+pow(y_theta,2))/pow(sigma,2))* cos(2*CV_PI*x_theta/lmbd + psi);
              }
          }
          return kernel;
      }
 
      int kernel_size=21;
      int pos_sigma= 4;
      int pos_lm = 37;
      int pos_th = 0;
      int pos_psi = 78;
      cv::Mat src_f;
      cv::Mat dest;
      cv::Mat image;
 
      void Process(int , void *)
      {
          double sig = pos_sigma;
          double lm = 0.5+pos_lm/100.0;
          double th = pos_th;
          double ps = pos_psi;
          cv::Mat kernel = mkKernel(kernel_size, sig, th, lm, ps);
          cv::filter2D(src_f, dest, CV_32F, kernel);
          //cv::imshow("Process window", dest);
          cv::Mat Lkernel(kernel_size*20, kernel_size*20, CV_32F);
          cv::resize(kernel, Lkernel, Lkernel.size());
          Lkernel /= 2.;
          Lkernel += 0.5;
          //cv::imshow("Kernel", Lkernel);
          cv::Mat mag;
          cv::pow(dest, 2.0, mag);
          cv::imshow("Mag", mag);
          //IplImage* image1 = cvCloneImage(&(IplImage)mag);
          //cvSaveImage("gab.bmp", image1, NULL);
         cv::imwrite("gab.bmp", mag);
      }
 
      int main(int argc, char** argv)
      {
          int e = argc;
          char st[_MAX_PATH];
          strcpy(st, argv[1]);
          image = cv::imread(st, 1);
          //cv::imshow("Src", image);
          //cv::Mat src;
          //cv::cvtColor(image, src, CV_BGR2GRAY);
          image.convertTo(src_f, CV_32F, 1.0/255, 0);
          if (!kernel_size%2)
          {
              kernel_size+=1;
          }
          //cv::namedWindow("Process window", 0);
          //cv::createTrackbar("Sigma", "Process window", &pos_sigma, kernel_size, Process);
          //cv::createTrackbar("Lambda", "Process window", &pos_lm, 100, Process);
          //cv::createTrackbar("Theta", "Process window", &pos_th, 180, Process);
          //cv::createTrackbar("Psi", "Process window", &pos_psi, 360, Process);
          Process(0,0);
          cv::waitKey(0);
          return 0;
      }
Подозреваю, что дело в функции convertTo().
Подскажите, как нормально сохранить результат.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2014, 01:42
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Opencv-gabor filter не сохраняет результирующую картинку (C++):

OpenCV 3.2.0 не открывает картинку imshow - C++
Взял стандартный пример из официальной документации OpenCV для 3.2.0 Features2D + Homography to find a known object никак не могу понять...

Не сохраняет картинку из pictureBox - C#
private void btn_Click(object sender, EventArgs e) { picBox.Image.Save(&quot;D:\\1.jpg&quot;); } ...

Bmp.savetofile не сохраняет картинку - Lazarus
Здравствуйте, у меня возник очень примитивный вопрос. Просто не пойму, что не так. Я заливаю фон PaintBox, к примеру, в красный цвет,...

OpenCV инвертировать черно-белую картинку - Python
Здравствуйте. Есть черно-белая картинка (именно черно-белая, а не оттенки серого), нужно её инвертировать. Поиск в FAQ ничего не дал. ...

Выделить линии и разрезать картинку по ним. (Opencv) - C#
Здравствуйте, наставьте на путь истинный, подскажите алгоритм. На данной картинке нужно выделить все цифры на отдельные блоки (т.е...

Магнитола не сохраняет последний воспроизведённый файл (с флешки), а позицию сохраняет - Автоэлектроника
Во общем в машине есть магнитола JVC, в ней есть CD диск, USB flash накопитель и радио... Так вот: если на флешке будет играть музыка то...

1
Людвиг Бодмер
349 / 348 / 133
Регистрация: 29.03.2013
Сообщений: 858
Завершенные тесты: 4
19.11.2014, 11:45 #2
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
snowleo, а image.convertTo(src_f, CV_8UC3, 255.0); пробовали?
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2014, 11:45
Привет! Вот еще темы с ответами:

HTML - Надо: вставить картинку в картинку, в эту картинку, ссылку в картинку - HTML, CSS
Вот схема моего сайта. http://s020.***********/i716/1404/8c/254516feacb3.jpg У меня пока что на этой странице есть: 1. Элемент Фон -...

Смысл функции filter. Перевести код функции filter в C++ - Matlab
Всем привет! у меня такая проблема. Нужно перевести код функции filter в C++. для функции y = filter (B, A, x) я нашла код в интернете: ...

Результирующую момента сил - Механика
http://s45.***********/i110/1212/16/e79524efc67c.jpg Как найти результирующую момента сил относительно оси вращения? Заранее большое...

Объединить две матрицы в результирующую - Turbo Pascal
Вот задание: Не смог придумать алгоритм чередования элементов, помогите написать этот кусок


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru