Wildcat 2 Жалоба Опубликовано November 27, 2009 Скажите, пожалуйста, с какими типами данных метрицы работает данная функция. В документации на этот вопрос ответа нет. На практике при инвертировании комплексной матрицы (двухканальной) возникает ошибка - некорректный тип данных. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано November 27, 2009 Скажите, пожалуйста, с какими типами данных метрицы работает данная функция. В документации на этот вопрос ответа нет. На практике при инвертировании комплексной матрицы (двухканальной) возникает ошибка - некорректный тип данных. В документации не указано, но думаю, что одноканальной квадратной с типом элемента 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 ); } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Wildcat 2 Жалоба Опубликовано November 27, 2009 Спасибо, придется писать инверсию, значит. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Vicul 0 Жалоба Опубликовано December 4, 2009 Спасибо, придется писать инверсию, значит. cvNot() - тоже инвертирует и без всякого "геморроя". Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано December 4, 2009 cvNot() - тоже инвертирует и без всякого "геморроя". Обратная матрица Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Wildcat 2 Жалоба Опубликовано December 4, 2009 Не могу писать сама, когда знаю, что уже есть реализованное. В результате сейчас пользуюсь функцией библиотеки 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] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Cfr 1 Жалоба Опубликовано December 8, 2009 Если не секрет, для чего используете матрицы над комплексными числами? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Wildcat 2 Жалоба Опубликовано December 9, 2009 Матрицы комплексных чисел использую для построения корреляционных фильтров. Сами фильтры строю для распознавания лиц, в ряде статей нашла описание такого подхода и пытаюсь его применить на практике. С учетом того, что постановка задачи довольно сложна и данные являются сильно зашумленными удовлетворительного результата пока добиться не удалось. Заодно уж тогда кину ссылки на статьи, кому интересно: http://www.osti.gov/bridge/servlets/purl/6...gtx/6143454.pdf http://www.ece.cmu.edu/research/publicatio...CE-2005-007.pdf Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах