Преобразование матричного цикла OpenCV в JavaCV

Не так давно получил книгу «Изучение OpenCV» О'Рейли, и с тех пор я был занят преобразованием всего кода примеров, который я там вижу, из OpenCV в JavaCV, за которым обычно следует немного моей собственной модификации тоже. Все это время я стараюсь максимально использовать чистый код OpenCV (язык C) и избегать Java. Например, я реализовал все элементы интерфейса напрямую через пакет OpenCV highgui в JavaCV, а не через Java Swing. Делая это, я надеюсь изучить библиотеку OpenCV и немного C в относительно короткие сроки, а также создать библиотеку полезных функций, которые я смогу легко преобразовать в C, если позже решу переключиться на чистый OpenCV.

В любом случае, я мало знаю C и иногда сталкиваюсь с проблемами при работе с указателями. В книге рекомендуется следующий код как оптимальное средство для итерации по 3-канальной матрице:

float sum( const CvMat* mat ) {
    float s = 0.0f;
    for(int row=0; row<mat->rows; row++ ) {
        const float* ptr = (const float*)(mat->data.ptr + row * mat->step);
        for( col=0; col<mat->cols; col++ ) {
            s += *ptr++;
        }
    }
    return( s );
}

Вот пояснение к этому коду:

При вычислении указателя в матрице помните, что данные элемента матрицы является союзом. Поэтому при разыменовании этого указателя необходимо указывать правильный элемент объединения, чтобы получить правильный тип указателя. Затем, чтобы компенсировать это указатель, необходимо использовать ступенчатый элемент матрицы. Как уже отмечалось, шаг элемент находится в байтах.Чтобы быть в безопасности, лучше всего выполнять арифметику указателя в байтах, а затем > приводить к соответствующему типу, в данном случае float. Хотя структура CVMat имеет > концепцию высоты и ширины для совместимости со старой структурой IplImage, вместо этого > мы используем более современные строки и столбцы. Наконец, обратите внимание, что мы пересчитываем ptr для > каждой строки, а не просто начинаем с начала, а затем увеличиваем этот указатель. каждое чтение. Это может показаться чрезмерным, но поскольку указатель данных CvMat может просто указывают на область интереса в более крупном массиве, нет гарантии, что данные будут > непрерывными по строкам.

Однако у меня возникли проблемы с преобразованием его в JavaCV. Поле ptr (указатель) кажется плавающим, что меня смущает. Я предполагаю, что на самом деле это не «указатель», а значение, к которому добавляется значение каждого пикселя? Или на самом деле это указатель, значение которого s находит общую сумму для всех столбцов в данной строке?

В любом случае, я был бы признателен, если бы кто-нибудь опубликовал для меня код JavaCV для эквивалентного цикла. Я знаю, что есть другие способы доступа к каждому пикселю в CvMat, но, насколько мне известно, все они менее эффективны или неточны.

7
задан flamming_python 29 March 2012 в 07:04
поделиться