Проблема присвоения значений массиву Mat в OpenCV 2.3 - кажется простой - PullRequest
5 голосов
/ 04 сентября 2011

Используя новый API для OpenCV 2.3, у меня возникают проблемы с присвоением значений массиву Mat (или, скажем, изображению) внутри цикла.Вот фрагмент кода, который я использую:

    int paddedHeight = 256 + 2*padSize; 
    int paddedWidth = 256 + 2*padSize;  

    int n = 266; // padded height or width

    cv::Mat fx = cv::Mat(paddedHeight,paddedWidth,CV_64FC1);
    cv::Mat fy = cv::Mat(paddedHeight,paddedWidth,CV_64FC1);        
    float value = -n/2.0f;

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            fx.at<cv::Vec2d>(i,j) = value++;                    

        value = -n/2.0f;
    }

    meshElement = -n/2.0f;

    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            fy.at<cv::Vec2d>(i,j) = value;
        value++;
    }

Теперь в первом цикле, как только j = 133, я получаю исключение, которое, похоже, связано с глубиной изображения, я не могу понять,что я тут делаю не так

Пожалуйста, сообщите!Спасибо!Error is here

1 Ответ

7 голосов
/ 04 сентября 2011

Вы получаете доступ к данным как 2-компонентный двойной вектор (используя .at<cv::Vec2d>()), но вы создали матрицы, содержащие только один компонентный двойной тип (используя CV_64FC1). Либо создайте матрицы, содержащие два компонента на элемент (с CV_64FC2), либо, что кажется более подходящим для вашего кода, получите доступ к значениям в виде простых двойных чисел, используя .at<double>(). Это взрывается ровно при j = 133, потому что это вдвое меньше вашего изображения, а когда рассматривается как содержащий двухкомпонентные векторы, когда оно содержит только 1, оно только вдвое меньше.

Или, может быть, вы можете объединить эти две матрицы в одну, содержащую два компонента на элемент, но это зависит от того, как вы собираетесь использовать эти матрицы в будущем. В этом случае вы также можете объединить два цикла и установить двухкомпонентный вектор:

cv::Mat f = cv::Mat(paddedHeight,paddedWidth,CV_64FC2);
float yValue = -n/2.0f;

for(int i=0;i<n;i++)
{
    float xValue = -n/2.0f;

    for(int j=0;j<n;j++)
    {
        f.at<cv::Vec2d>(i,j)[0] = xValue++;
        f.at<cv::Vec2d>(i,j)[1] = yValue;
    }

    ++yValue;
}

Это может привести к лучшей схеме доступа к памяти, если вам всегда нужны оба значения, одно из fx и одно из fy, для одного и того же элемента.

...