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

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

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

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

C++

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

Q&A

解決済

ファイル保存について

haihun
haihun

総合スコア2

OpenCV

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

C++

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

2回答

0グッド

0クリップ

437閲覧

投稿2022/10/15 15:39

編集2022/10/15 16:02

初心者です

実現したいこと

ウェブカメラでcv::Mat画像をリアルタイムで表示しています。
その画像に処理をして、cv::formatでcsv保存しています。
ファイルに保存しているときにファイルのサイズが10MBになったら、ファイルに書き込むのをやめるプログラムを組み込みたいのですが、どういう風に書けばいいのかわからなくて困っています。
このことについて解決したいです。

該当のソースコード

int main() { 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 + "rng_" + str; std::cout << filepath << std::endl; while (cam.read(frame)) { cv::Mat gray; cv::Mat adp_binary; //グレースケール処理 cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY); cv::imshow("gray", gray); //適応的二値化処理 cv::adaptiveThreshold(gray, adp_binary, 255, cv::ADAPTIVE_THRESH_GAUSSIAN_C, cv:: THRESH_BINARY, 7, 0); cv::imshow("adp_binaly", adp_binary); cv::Mat XOR1 = adp_binary.reshape(0, 1); int center = adp_binary.rows / 2; cv::Mat cut_array1(XOR1, cv::Rect(center - 23, 0, XOR1.cols - adp_binary.cols, 1)); cv::Mat cut_array2(XOR1, cv::Rect(center + 18, 0, XOR1.cols - adp_binary.cols, 1)); cv::Mat cut_array3(XOR1, cv::Rect(center - 5, 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 tempXOR = XOR.reshape(0, adp_binary.rows - 1); cv::imshow("XOR", tempXOR); std::ofstream ofs; ofs.open(filepath); cv::Mat seq = tempXOR / 100; ofs << cv::format(seq, cv::Formatter::FMT_CSV) << std::endl; ofs.close(); cv::waitKey(100000); } return 0; }

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

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

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

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

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

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

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

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

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

2022/10/16 00:17

こちらの質問が複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

y_waiwai

2022/10/15 15:43

コードを提示しないと答えようもないと思いますが。

回答2

0

ベストアンサー

1文字1byteなので,10000000文字書き込んだら終了,で実装可能だと思います.CSV Formatterを使用されると,Commaとスペースに容量を取られて画像情報としてかなり少ない容量しか書き込めなさそうではありますが.

とりあえず,書き込みは既にあるofsに対して出力<<を行えば良いことがわかるので,例えば画素値10を書き込みたいならofs << 10で良いです.2文字書き込むことになるので2byte書き込むことになります(小泉構文か).

CSVのFormatでも構わないなら,一度sstreamに吐き出させて,文字列に変換ss.str()したあと,ss.str().substr(0, 1e7)として10MB取り出すことができます.

C++

1std::stringstream ss; 2ss << cv::format(seq, cv::Formatter::FMT_CSV); 3std::ofs << ss.str().substr(0, 1e7) << std::endl;

ただ途中で切れるのでCSVのフォーマットとして体裁が整っているかはわからないです.

投稿2022/10/16 02:22

PondVillege

総合スコア1066

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

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

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

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

回答へのコメント

haihun

2022/10/16 03:00

ありがとうございます!
PondVillege

2022/10/16 03:07

言い忘れてましたが,これは元データseqをCSVに変換したとき10MBを超える場合の処理です. もし撮影された映像がこれよりも少なく,データをCSVに積み重ねていくスタイルなら,文字列長ss.str().size()をカウントアップして1e7になったら別のファイルに保存する.みたいな処理が必要になると思います.
haihun

2022/10/16 09:09

丁寧にありがとうございます.

0

保存するデータは自分が持ってるんですから、それが10Mを超えるかどうかで保存するかどうかを決めればいいかと

投稿2022/10/15 23:12

y_waiwai

総合スコア86072

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

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

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

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

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

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

OpenCV

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

C++

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