質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

2622閲覧

imshowで表示できるがimwriteでうまく出力できない

stdnium

総合スコア15

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2017/11/20 03:41

こんにちは。
画像処理を勉強中の者です。

###前提・実現したいこと
画像を位相画像に変換し、その画像を使ってマッチングをするようなプログラムの作成に取り組んでいます。
今回のプログラムは位相画像の作成までです。

###発生している問題・エラーメッセージ
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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

imwriteの直前にoutd.convertTo(outd, CV_8U, 255);を入れてやってください。

投稿2017/11/20 05:06

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

stdnium

2017/11/20 09:38

解決しました! 迅速な回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問