こんにちはみんな私は画像の固有値と固有ベクトルを計算するプログラムをやっています。このために、私はOpenCVおよびArmadilloライブラリを使用しています。OpenCVでは画像をプログラムにアップロードし、Armadilloでは固有値と固有ベクトルを計算します。
固有値と固有ベクトルを計算できるようにするには、cv :: Matからarma :: matに変換する必要があります。これについては、前の回答に基づいて次のことを行います。
arma::mat arma_mat(reinterpret_cast<double*>(image.data), image.rows, image.cols);
完全なコードはここにあります:
#include<armadillo>
#include<opencv2/opencv.hpp>
#include<iostream>
int main()
{
cv::Mat image = cv::imread("Imgs/face.jpg", CV_LOAD_IMAGE_GRAYSCALE);
if(!image.data){
std::cout << "No se pudo cargar la imágen\n";
return -1;
}
arma::mat arma_mat(reinterpret_cast<double*>(image.data), image.rows, image.cols);
return 0;
}
コードはコンパイルに問題はありませんが、実行されると、cv :: Matからarma :: matに変換される行に到達すると、実行が停止し、コンソールが表示されます(終了値:-1)誰もがこれを知っていますか起こっている?
自分が何をしているかを本当に理解していない限り、再解釈キャストを使用しないでください。それが何をするかについての良い説明については、この質問の受け入れられた答えを見てください。
私はopencvの経験がなく、アルマジロだけを使っています。見るとOpenCVのドキュメント私は見ることができimage.data
ていますuchar
。値を単にreinterpret_castしてdoubleにすることはできません。これは未定義の動作であり、この場合は間違いなく間違っています。
アルマジロ行列クラス(arma::Mat
)はテンプレートです。を作成しMat<uchar>
てMat<uchar>(ptr_aux_mem, n_rows, n_cols, copy_aux_mem = true, strict = false)
コンストラクターを使用すると、要素のコピーを回避できます。もちろん、他のアルマジロタイプを使用することもできますが、その場合、他のタイプに変換するために要素をコピーする必要があります(toなどarma::mat
、これは単なるエイリアスですarma::Mat<double>
)。その場合、別のコンストラクターを使用します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加