逆関数や関数の多い画像を処理したい。コードを高速に実行するには、3 つの反転方法の中で高速な方法を提案できますか?
double cvInvert(const CvArr* src, CvArr* dst, int method=CV_LU)
- CV_LU 最適なピボット要素が選択されたガウス消去法
- CV_SVD 特異値分解 (SVD) メソッド
- CV_SVD_SYM 対称正定義行列の SVD メソッド。
逆関数や関数の多い画像を処理したい。コードを高速に実行するには、3 つの反転方法の中で高速な方法を提案できますか?
double cvInvert(const CvArr* src, CvArr* dst, int method=CV_LU)
OpenCV2.x にはMat::inv(int method)
、逆行列を計算するために呼び出される新しいインターフェイスがあります。リファレンスを参照してください。
C++: MatExpr Mat::inv(int method=DECOMP_LU) const
パラメータ: メソッド –</p>
Matrix inversion method. Possible values are the following: DECOMP_LU is the LU decomposition. The matrix must be non-singular. DECOMP_CHOLESKY is the Cholesky LL^T decomposition for symmetrical positively defined matrices only. This type is about twice faster than LU on big matrices. DECOMP_SVD is the SVD decomposition. If the matrix is singular or even non-square, the pseudo inversion is computed.
それぞれの方法でテストを行ったところ、テスト ケースでは DECOMP_CHOLESKY が最速であり、LU も同様の結果を示しています。
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>
int main(void)
{
cv::Mat img1 = cv::imread("2.png");
cv::Mat img2, img3, img;
cv::cvtColor(img1, img2, CV_BGR2GRAY);
img2.convertTo(img3, CV_32FC1);
cv::resize(img3, img, cv::Size(200,200));
double freq = cv::getTickFrequency();
double t1 = 0.0, t2 = 0.0;
t1 = (double)cv::getTickCount();
cv::Mat m4 = img.inv(cv::DECOMP_LU);
t2 = (cv::getTickCount()-t1)/freq;
std::cout << "LU:" << t2 << std::endl;
t1 = (double)cv::getTickCount();
cv::Mat m5 = img.inv(cv::DECOMP_SVD);
t2 = (cv::getTickCount()-t1)/freq;
std::cout << "DECOMP_SVD:" << t2 << std::endl;
t1 = (double)cv::getTickCount();
cv::Mat m6 = img.inv(cv::DECOMP_CHOLESKY);
t2 = (cv::getTickCount()-t1)/freq;
std::cout << "DECOMP_CHOLESKY:" << t2 << std::endl;
cv::waitKey(0);
}
実行結果は次のとおりです。
ル:0.000423759
DECOMP_SVD:0.0583525
DECOMP_CHOLESKY:9.3453e-05