Пытаюсь реализовать алгоритм SIFT с нуля. Прямо сейчас я пытаюсь создать масштабное пространство, которое содержит несколько размытых изображений, которые уменьшаются в масштабе. Моим инстинктом было использовать массивы, потому что я знал размеры, которые мне нужны, и они не подлежали изменению. В 2D-массиве каждый элемент представляет собой матрицу, представляющую размытое изображение. Каждый столбец представляет октаву. Однако ни OpenCV (версия 2.4), ни g ++, похоже, не понимают, чего я хочу. Я использую файлы заголовков и реализации, однако алгоритм SIFT не подходит для объектов (IMO), поэтому я их избегаю. Вот мой код для файла заголовка:
#include <opencv2/opencv.hpp>
void generateOctaves(cv::Mat img); // Function to generate octaves.
void approxLoG(cv::Mat passOctave[4][5]); // Function to approximate Laplacian of Gaussian
Вот код соответствующего файла реализации:
#include <iostream>
#include <cmath>
#include <opencv2/opencv.hpp>
#include "scaleSpace.h"
// Generate four octaves with five images each.
using namespace std;
using namespace cv;
void generateOcatves(Mat img) // Determine Octaves
{
Mat octaves[4][5]; // Creates 4x5 array/grid to hold 4 octaves, each comprised of 5 images.
Mat resizedImg; // Holds resized image.
resize(img, resizedImg, Size(), 2, 2, CV_INTER_CUBIC); // Double image size to allow for more keypoints
Mat originalResize = resizedImg; // Temp matrix to hold the original resized image prior to blurring.
double sigma = 1.6; // General value for sigma
double k = sqrt(2); // Gneral value for k
for(int i=0; i < 4; i++)
{
if (i > 0) // Shrink image on all iterations other than the first.
{
resize(originalResize, resizedImg, Size(), 0.5, 0.5, CV_INTER_AREA);
// Reset altered values.
originalResize = resizedImg;
sigma = 1.6;
}
for(int j=0; j < 5; j++)
{
octaves[i][j] = resizedImg;
GaussianBlur(resizedImg, resizedImg, Size(0,0), sigma, sigma, 0); // Perform Gaussian Blur on the image.
sigma = sigma * k;
imshow("Octave", resizedImg);
}
cout << "Press Enter to continue." << endl;
while (true)
{
char cont=(char)waitKey(25);
if (cont == 27)
{
destroyAllWindows();
break;
}
}
approxLoG(octaves[4][5]);
}
}
void approxLoG(Mat passOctave[4][5])
{
// Compute the DoG of consecutive scales. Computing the DoG gives an approximation of the LoG in less time.
// Since the LoG would have to be computed for multiple images, the DoG is used.
Mat array_DoG[4][4]; // 4x4 array to hold four octaves and 4 DoG images. There is one less DoG created than images in each octave for each octave.
for(int i=0; i < 4; i++)
{
for(int j=0; j < 4; j++)
{
Mat DoG = passOctave[i][j] - passOctave[i][j+1]; // Compute DoG
imshow("Difference of Gaussian", DoG);
array_DoG[i][j] = DoG;
}
char cont=(char)waitKey(25);
if (cont == 27)
{
destroyAllWindows();
}
}
}
Я получаю следующую ошибку компиляции:
g++ -g -c scaleSpace.cpp `pkg-config --cflags --libs opencv2`
scaleSpace.cpp: In function ‘void generateOcatves(cv::Mat)’:
scaleSpace.cpp:50:26: error: cannot convert ‘cv::Mat’ to ‘cv::Mat (*)[5]’ for argument ‘1’ to ‘void approxLoG(cv::Mat (*)[5])’
approxLoG(octaves[4][5]);
Что меня особенно смущает, так это то, что создание одномерного массива матриц можно выполнить с помощью OpenCV, как показано здесь. Возможно, я мог бы использовать 2D-вектор вместо массива. Но даже в этом случае, почему 2D-массив не работает, а 1D-массив работает?





Ваша линия:
approxLoG(octaves[4][5]);
octaves[4][5], как и любой другой octaves[i][j], обращается к одному элементу. Это то, что находится за пределами поля.
Чтобы передать массив, просто напишите:
approxLoG(octaves);
@SaulKapruac Помните, что индексы находятся в пределах от 0 до размера-1, размер запрещен. {0, 1, 2, 3} для i и {0, 1, 2, 3, 4} для j. Более высокие значения, такие как octaves[i=4][j=5], недопустимы.
Да, но мои условия таковы, что i и j меньше 4 и 5 соответственно. Следовательно, цикл for прекратит итерацию, когда будут достигнуты эти числа и условие «меньше чем» больше не будет выполняться.
@SaulKapruac Я говорю о вашем звонке: approxLoG(octaves[4][5]);. Ваши циклы for в порядке.
Я все еще не понимаю, как октавы выходят за рамки. Не является ли каждый элемент октав матрицей? Я посмотрел на свою логику цикла for, и мне показалось, что она находится в правильных пределах. Не могли бы вы уточнить немного подробнее?