Как настроить элемент в многоканальной матрице через CV_MAT_ELEM? - PullRequest
0 голосов
/ 14 декабря 2011

Я создал OpenCV матрица:

CvMat * src = cvCreateMat(1, 2, CV_32FC2);

Затем я хочу настроить элемент row = 0, col = 1, channel = 1 В соответствии с примером в описании документация для CvMat Я попытался установить элемент со следующим кодом:

 CV_MAT_ELEM(*src, float, 0, 1 * 2 + 1) = 123;

Но assert запущен.
И причина очевидна:

У нас естьследующие определения в источниках OpenCV:

#define CV_MAT_ELEM_PTR_FAST( mat, row, col, pix_size )  \
    (assert( (unsigned)(row) < (unsigned)(mat).rows &&   \
             (unsigned)(col) < (unsigned)(mat).cols ),   \
    (mat).data.ptr + (size_t)(mat).step*(row) + (pix_size)*(col))

#define CV_MAT_ELEM( mat, elemtype, row, col )           \
    (*(elemtype*)CV_MAT_ELEM_PTR_FAST( mat, row, col, sizeof(elemtype)))

В моем случае mat.cols == 2 и col == 1 * 2 + 1 == 3.

Что не так: документация или утверждение в источниках OpenCV?
Как управлятьэто?
Как настроить элемент многоканальной матрицы?Спасибо.

PS Разработчикам OpenCV, если кто-нибудь здесь.
Когда я нажимаю "Вы можете создать его сейчас", чтобы создать новую учетную запись для сообщения об ошибке со страницы http://opencv.willowgarage.com/wiki/Welcome?action=login, Я получаю сообщение об ошибке.«Неизвестное действие newaccount.»

ОБНОВЛЕНИЕ:

Я использую OpenCV 2.1.

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Я работал над использованием CV_MAT_ELEM:

float * src_ptr = (float*)src->data.ptr;
*(src_ptr + 1 * 2 + 1) = 123;
0 голосов
/ 14 декабря 2011

Не ответ на ваш вопрос, но хорошее предложение: ни документация, ни исходный код не верны.

Но почему вы не используете интерфейс C ++?Могу поспорить, что вы не используете интерфейс C, потому что он вам действительно нужен (вы создаете для какой-то странной встроенной платформы, которая не может скомпилировать c ++).

Mat src(1, 2, CV_32FC2);

// isn't it nicer than CV_UGLY_AND_SCARY_MACRO()?    
src.at<Vec2f>(0,1)[1] = 123; // (0,1) means row 0, col 1. [1] means channel 1. 

EDIT

Из OpenCV:

Для одноканальных матриц существует макрос CV_MAT_ELEM (matrix, elemtype, row, col), то есть для 32-битной вещественной матрицы с плавающей запятой

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...