Создание 2D-массива матриц в OpenCV?

Пытаюсь реализовать алгоритм 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-массив работает?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
314
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ваша линия:

approxLoG(octaves[4][5]);

octaves[4][5], как и любой другой octaves[i][j], обращается к одному элементу. Это то, что находится за пределами поля.

Чтобы передать массив, просто напишите:

approxLoG(octaves);

Я все еще не понимаю, как октавы выходят за рамки. Не является ли каждый элемент октав матрицей? Я посмотрел на свою логику цикла for, и мне показалось, что она находится в правильных пределах. Не могли бы вы уточнить немного подробнее?

ElderFuthark 13.04.2018 00:47

@SaulKapruac Помните, что индексы находятся в пределах от 0 до размера-1, размер запрещен. {0, 1, 2, 3} для i и {0, 1, 2, 3, 4} для j. Более высокие значения, такие как octaves[i=4][j=5], недопустимы.

O'Neil 13.04.2018 02:50

Да, но мои условия таковы, что i и j меньше 4 и 5 соответственно. Следовательно, цикл for прекратит итерацию, когда будут достигнуты эти числа и условие «меньше чем» больше не будет выполняться.

ElderFuthark 13.04.2018 04:46

@SaulKapruac Я говорю о вашем звонке: approxLoG(octaves[4][5]);. Ваши циклы for в порядке.

O'Neil 13.04.2018 12:28

Другие вопросы по теме