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

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

ただいまの
回答率

90.32%

  • C++

    3777questions

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

  • OpenCV

    1237questions

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

OpenCVのimwriteがnullになる

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 359

Takumi_s

score 3

 発生している問題

imshow で表示できている画像情報が imwrite で保存できません.

以下の機能を持つプログラムを作成しました.

  1. ドラッグ&ドロップしたディレクトリ(inputDir)の直下にディレクトリ(outputDir)を作成
  2. inputDir内の画像を読み込みリサイズし,outputDir 内に保存

しかしながら,現状,outputDir 内に空のファイルが作成されるのみとなっています.

また,複数の画像ファイルが存在しているディレクトリを入力しても,処理が 1 枚分で止まっているようです.

なので,正しく動作するためにはどう修正すればよいかお教え願います.

 試したこと

  • imwrite を除いた状態で imshow で dst を表示 -> 正常に処理される

 環境

  • Microsoft windows 10 64bit
  • Visual Studio 2013 Ultimate
  • OpenCV_3.0.0

 参考にしたサイト

  • フォルダ内の全ての画像ファイル名を取得する方法(C++)(http://tecsingularity.com/opencv/filename/) 
  • string に vector を使う(http://www.eonet.ne.jp/~maeda/cpp/string3.htm)
  • OpenCVのimreadをしてもMat::dataがNULLになる(https://teratail.com/questions/45001)

 プログラム

#define _CRT_SECURE_NO_WARNINGS

#include <Windows.h>
#include <direct.h>
#include <stdexcept>
#include <iostream>
#include <vector>
#include <string>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

string inputDir;

vector<string> getImageName(string dir_name);

int main(int argc, char* argv[])
{
    // 入力ディレクトリの取得
    if (argc > 1) {
        inputDir = argv[1];
        cout << "input directory : " << inputDir << endl;
    }
    else {
        cerr << "no input file" << endl;
        while (1) {};
        return -1;
    }

    size_t length = inputDir.length();
    //cout << "length : " << length << endl;

    while (true) {
        auto pos = inputDir.find("\\");
        if (pos == -1)    break;

        inputDir.replace(pos, 1, "/");
        //cout << "pos : " << pos + 1 << endl;
    }

    string dir = inputDir + "/";
    string outputDir = dir + "resized";

    try {
        if (_mkdir(outputDir.c_str()) == 0){
            cout << "success create dir : " << outputDir << endl;
        }
        else{
            cout << "do not create." << endl;
        }
    }
    catch (...) {
        cout << "input error" << endl;
        while (1) {};
    }

    // ファイル内の画像名の取得
    vector<string> file_names = getImageName(dir);

    // 表示・保存部分
    string filePath;
    for (auto f : file_names) {
        //cout << f << endl;

        string fileName = f.c_str();
        //cout << "fileName : " << fileName << endl;
        string filePath = dir + fileName;
        //cout << "filePath : " << filePath << endl;
        Mat src = imread(filePath);
        Mat dst;

        resize(src, dst, Size(227, 227), 0, 0, INTER_LINEAR);

        string outputPath = outputDir + "/" + fileName;
        cout << "output file path : " << outputPath << endl;

        imshow("img", dst);
        waitKey(30);

        imwrite(outputPath, dst);
        waitKey(30);
    }

    system("pause");
    return 0;
}

// inputDir内にある画像名を取得する
vector<string> getImageName(string dir_name) {

    HANDLE hFind;
    WIN32_FIND_DATA win32fd;
    std::vector<std::string> file_names;

    // png,jpg,bmpの拡張子のファイルのみを読み込む
    std::string extension[3] = { "png", "jpg", "bmp" };

    for (int i = 0; i < 3; i++) {

        string search_name = dir_name + "*." + extension[i];
        hFind = FindFirstFile(search_name.c_str(), &win32fd);

        if (hFind == INVALID_HANDLE_VALUE) {
            continue;
        }
        do {

            if (win32fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) {
            }
            else {
                file_names.push_back(win32fd.cFileName);
            }
        } while (FindNextFile(hFind, &win32fd));

        FindClose(hFind);
    }

    return file_names;
}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

0

cv::imwriteのドキュメントのサンプルによると
cv::imwriteは例外を投げる可能性があるようです。

とりあえず、例外を記録してみましょう。

try {
    imwrite(outputPath, dst);
} catch (runtime_error& ex) {
    cerr << "Exception:" << ex.what() << endl;
    cerr << "at " << outputPath << endl;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

コードを読む限り、FindFirstFileの結果くらいしか疑うところは無さそうです。
パッと思いつく可能性としては、Unicode版が動作してて、win32fd.cFileNameがwstringになっている、など。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

こんにちは。

Visual Stuido 2017 + OpenCV 3.2でやってみましたが、問題なく動作しました。
ファイル名のパスに日本語が含まれていると正常動作しなことがあります。
jpgファイル等を日本語が含まれないパスに保存してトライしてみるとうまくいくかも知れません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C++

    3777questions

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

  • OpenCV

    1237questions

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