Jump to content
Compvision.ru
Sign in to follow this  
Wildcat

cvInvert

Recommended Posts

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

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

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

Share this post


Link to post
Share on other sites
Скажите, пожалуйста, с какими типами данных метрицы работает данная функция.

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

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

В документации не указано, но думаю, что одноканальной квадратной с типом элемента 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 );

}

Share this post


Link to post
Share on other sites
Спасибо, придется писать инверсию, значит.

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

Share this post


Link to post
Share on other sites

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

В результате сейчас пользуюсь функцией библиотеки 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]

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

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

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

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

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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×