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

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

新規登録して質問してみよう
ただいま回答率
86.02%
OpenCV

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

C++

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

Q&A

解決済

ファイル出力について

haihun
haihun

総合スコア2

OpenCV

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

C++

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

1回答

0グッド

0クリップ

302閲覧

投稿2022/10/22 14:11

前提

ウェブカメラで取得したcv::Mat画像の画素値をvectorで格納してcsvファイルに出力しているのですが,文字化け?しているせいかちゃんと反映されていません.

イメージ説明

画素値を1,0にしているので,空白のところには1が出力されているはずですが,出力されていないです.
また、0の形がいびつになってしまっています.

実現したいこと

・1,0で出力
・文字化けしないようにしたい

該当のソースコード

int main(int argc, char* argv[]) { cv::Mat frame; cv::VideoCapture cam(0); if (!cam.isOpened()) //正常にカメラが起動できなければ終了 { return -1; } cv::Mat XOR = { 0 }; //乱数保存フォルダ指定 std::string path = "ユーザー名が出るので伏せます"; //乱数保存ファイル作成 time_t t1 = time(NULL); //現在の日時取得 struct tm local; //日時情報を格納する変数を用意する localtime_s(&local, &t1); //ローカル日時を変数に格納する //文字列への変換 char str[100]; strftime(str, sizeof(str), "%Y%m%d_%H%M%S.csv", &local); std::string filepath = path + str; while (cam.read(frame)) { cv::Mat gray; cv::Mat adp_binary; //グレースケール処理 cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY); //適応二値化処理 cv::adaptiveThreshold(gray, adp_binary, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv::THRESH_BINARY, 7, 0); //XORshift cv::Mat XOR1 = adp_binary.reshape(0, 1); //1次元配列に変換 int center = adp_binary.rows / 2; cv::Mat cut_array1(XOR1, cv::Rect(center - 89, 0, XOR1.cols - adp_binary.cols, 1)); cv::Mat cut_array2(XOR1, cv::Rect(center + 31, 0, XOR1.cols - adp_binary.cols, 1)); cv::Mat cut_array3(XOR1, cv::Rect(center - 18, 0, XOR1.cols - adp_binary.cols, 1)); cv::Mat cut_array4(XOR1, cv::Rect(center + 7, 0, XOR1.cols - adp_binary.cols, 1)); bitwise_xor(cut_array1, cut_array2, cut_array1); bitwise_xor(cut_array1, cut_array3, cut_array1); bitwise_xor(cut_array1, cut_array4, cut_array1); bitwise_xor(XOR, cut_array1, XOR); cv::Mat anotherXOR = XOR.reshape(0, adp_binary.rows - 1); //元の画像サイズに戻す cv::Mat seq = anotherXOR / 255; //画素値を1か0にする std::vector<uchar> array; if (seq.isContinuous()) { //cv::Mat seqが連続だったら、1次元配列になる array.assign((uchar*)seq.data, (uchar*)seq.data + seq.total()); //arrayにseqの画素値を代入 } else { for (int i = 0; i < seq.rows; ++i) { array.insert(array.end(), seq.ptr<uchar>(i), seq.ptr<uchar>(i) + seq.cols); //arrayの末尾に新たに取得した画素値を代入 } } std::ofstream ofs(filepath, std::ios::binary); //ファイルをバイナリ形式でオープン for (auto& i : array) ofs << i << "," << std::endl; //array(画素値を格納したもの)をファイルに出力 ofs.close(); int inp_key = cv::waitKey(1); if (inp_key == 27 || inp_key == 81 || inp_key == 113) { break; } } cv::destroyAllWindows(); cam.release(); return 0; }

以下のような質問にはグッドを送りましょう

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

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

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

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

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

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

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

適切な質問に修正を依頼しましょう。

yominet

2022/10/22 17:05

CSVファイルなので、バイナリではまずいのでは?

回答1

0

ベストアンサー

for (auto& i : array) ofs << i << "," << std::endl; //array(画素値を格納したもの)をファイルに出力

ためしに (ofs じゃなく) std::cout にプリントしてみて。期待通りに 1/0 が出力されますか?
for ( int i : array ) 以下同文 だったらどうなりますか?

投稿2022/10/22 16:30

編集2022/10/22 16:31
episteme

総合スコア16009

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

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

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

このような回答には修正を依頼しましょう。

回答へのコメント

haihun

2022/10/22 17:25

std::coutでプリントしたところ期待通りに出力されませんでしたが、for(int i:array)にし、プリントしたところ期待通りに出力されていることを確認できました。 初心者なので、なぜfor(auto& i:array)ではいけないのか教えていただきたいです。 ありがとうございます。
episteme

2022/10/22 23:07

for (auto& i : array) ofs << (int)i << "," << std::endl; でもOKのはず。 # ひんと: operator overload
haihun

2022/10/23 04:20

ありがとうございます。 勉強になります。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

OpenCV

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

C++

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