こんにちは。
画像処理を勉強中の者です。
###前提・実現したいこと
画像を位相画像に変換し、その画像を使ってマッチングをするようなプログラムの作成に取り組んでいます。
今回のプログラムは位相画像の作成までです。
###発生している問題・エラーメッセージ
imshowでは位相画像が表示されるのですが、imwriteだと黒一色の画像が出力されてしまいます。
###C++
#include <opencv2/opencv.hpp> #include <opencv2/features2d.hpp> #include <opencv2/xfeatures2d.hpp> #include <opencv2/xfeatures2d/nonfree.hpp> // SIFT・SURFモジュール用 #include <opencv2/core.hpp> #include <opencv2/highgui.hpp> #include <iostream> #include <cmath> #include <string> #include <sstream> #include <ctype.h> using namespace cv; using namespace std; int main() { // 入力 cv::Mat img1 = cv::imread("C:/opencv/image/lenna.jpg", 0); // 変換用 cv::Mat fur; // 実部のみのimg1と虚部を0で初期化したMatを入れた配列 cv::Mat RealImg[] = { Mat_<float>(img1), Mat::zeros(img1.size(), CV_32F) }; // 配列を合成 merge(RealImg, 2, fur); // フーリエ変換 dft(fur, fur); Mat sptmp[2]; split(fur, sptmp); Mat retmp = sptmp[0].clone(); Mat imtmp = sptmp[1].clone(); Mat seiki = sptmp[0].clone(); pow(retmp, 2, retmp); pow(imtmp, 2, imtmp); seiki = retmp + imtmp; sqrt(seiki, seiki); sptmp[0] = sptmp[0] / seiki; sptmp[1] = sptmp[1] / seiki; merge(sptmp, 2, fur); // 逆フーリエ cv::idft(fur, fur); // 複素画像の実部虚部を二枚の画像に分離 Mat splitimg[2]; split(fur, splitimg); // 表示用 Mat out[2]; // フーリエ後を実部と虚部に分ける split(fur, out); // 表示用に正規化 Mat outd; normalize(out[0], outd, 0, 1, CV_MINMAX); imshow("dft", outd); imwrite("C:/opencv/image/out.jpg", outd); waitKey(-1); return 0; }
###試したこと
本来、imwriteを使う必要性はなく、上記プログラムを関数として呼び出し元画像と位相画像でマッチングするプログラムができればよいのですが、
その際にもエラーでうまく呼び出しができなかったため同じような理由かと思うに至りました。
###補足情報(言語/FW/ツール等のバージョンなど)
OpenCV 3.3.0
VisualStudio2017

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/11/20 09:38