Перейти к содержимому
Compvision.ru
Wildcat

cvInvert

Recommended Posts

Скажите, пожалуйста, с какими типами данных метрицы работает данная функция.

В документации на этот вопрос ответа нет.

На практике при инвертировании комплексной матрицы (двухканальной) возникает ошибка - некорректный тип данных.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Скажите, пожалуйста, с какими типами данных метрицы работает данная функция.

В документации на этот вопрос ответа нет.

На практике при инвертировании комплексной матрицы (двухканальной) возникает ошибка - некорректный тип данных.

В документации не указано, но думаю, что одноканальной квадратной с типом элемента CV_32F или CV_64F.

Она определена так:

CV_IMPL double

cvInvert( const CvArr* srcarr, CvArr* dstarr, int method )

{

cv::Mat src = cv::cvarrToMat(srcarr), dst = cv::cvarrToMat(dstarr);

CV_Assert( src.type() == dst.type() && src.rows == dst.cols && src.cols == dst.rows );

return cv::invert( src, dst, method == CV_CHOLESKY ? cv::DECOMP_CHOLESKY :

method == CV_SVD || method == CV_SVD_SYM ? cv::DECOMP_SVD : cv::DECOMP_LU );

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Спасибо, придется писать инверсию, значит.

cvNot() - тоже инвертирует и без всякого "геморроя".

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
cvNot() - тоже инвертирует и без всякого "геморроя".

:)

Обратная матрица

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Не могу писать сама, когда знаю, что уже есть реализованное.

В результате сейчас пользуюсь функцией библиотеки alglib :)

Вот интерфейс для ее использования:

int alglibInvert(const CvMat *src, CvMat *dst) {
unsigned underlyingType = CV_32F;

CvMat *srcRe = cvCreateMat(src->rows, src->cols, underlyingType);
CvMat *srcIm = cvCreateMat(src->rows, src->cols, underlyingType);
cvSplit(src, srcRe, srcIm, NULL, NULL);

ap::complex_2d_array a;
a.setbounds(0, src->rows - 1, 0, src->cols - 1);
for(int i = 0; i < src->rows; i++)
for(int j = 0; j < src->cols; j++) {
unsigned place = j*src->rows + i;
float val1 = srcRe->data.fl[place];
float val2 = srcIm->data.fl[place];
a(i,j).x = srcRe->data.fl[place];
a(i,j).y = srcIm->data.fl[place];
}
cmatrixinverse(a, src->rows);

// fill values to dst
CvMat *dstRe = cvCreateMat(src->rows, src->cols, underlyingType);
CvMat *dstIm = cvCreateMat(src->rows, src->cols, underlyingType);
for(int i = 0; i < dst->rows; i++)
for(int j = 0; j < dst->cols; j++) {
unsigned place = j*dst->rows + i;
dstRe->data.fl[place] = (float)a(i,j).x;
dstIm->data.fl[place] = (float)a(i,j).y;
}
cvMerge(dstRe, dstIm, NULL, NULL, dst);

cvReleaseMat(&srcRe);
cvReleaseMat(&srcIm);
cvReleaseMat(&dstRe);
cvReleaseMat(&dstIm);
return 0;
}
[/codebox]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Если не секрет, для чего используете матрицы над комплексными числами?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Матрицы комплексных чисел использую для построения корреляционных фильтров.

Сами фильтры строю для распознавания лиц, в ряде статей нашла описание такого подхода и пытаюсь его применить на практике.

С учетом того, что постановка задачи довольно сложна и данные являются сильно зашумленными удовлетворительного результата пока добиться не удалось.

Заодно уж тогда кину ссылки на статьи, кому интересно:

http://www.osti.gov/bridge/servlets/purl/6...gtx/6143454.pdf

http://www.ece.cmu.edu/research/publicatio...CE-2005-007.pdf

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×