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

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

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

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

C++

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

Q&A

解決済

2回答

1191閲覧

(クラス分けを伴う)BGRをHSVに変換したい。

nigg_1513

総合スコア16

OpenCV

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

C++

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

0グッド

0クリップ

投稿2019/06/14 06:13

編集2019/06/17 04:36

###実現したいこと
クラス分けをする
opencvを利用し、BGRをHSVに変換したい。

###利用している環境
opencv3.1.0,visualstudio2015

###発生している問題
ハンドルエラーの発生
イメージ説明

###原因と思われる箇所

main文

1int main(int argc, char** argv[]) 2{ 3 char imgname[400]; 4 5 ImgInfo imginfo; 6 ImgProcess imgprocess; 7 8 std::ofstream LValueFile("BValueFile.csv"); 9 10 for (int i = 0; i < 125; i++) { 11 12 sprintf_s(imgname, "img_%d.jpg", i); 13 14 imginfo.SetImg(cv::imread(imgname, CV_LOAD_IMAGE_COLOR)); 15 if (imginfo.GetImg().empty()) return -1; 16 17 imgprocess.ImgInput(imginfo.GetImg());  //←ここが原因だと思われる 18 19 cv::namedWindow("hsvimg", cv::WINDOW_AUTOSIZE); 20 cv::imshow("hsvimg",imginfo.GetHsvImg()); 21 cv::waitKey(30); 22 } 23 return 0; 24}

###関連ソースコード

ImgInfo

1class ImgInfo 2{ 3public: 4 //Ctor/Dtor 5 ImgInfo(); 6 ~ImgInfo(); 7 8 //Setter/Getter 9 cv::Mat GetImg(); 10 void SetImg(cv::Mat _img); 11 12 cv::Mat GetHsvImg(); 13 void SetHsvImg(cv::Mat _hsv_img); 14 15private: 16 cv::Mat img; 17 cv::Mat hsvImg; 18}; 19 20 21cv::Mat ImgInfo::GetImg() { 22 return this->img; 23} 24void ImgInfo::SetImg(cv::Mat _img) { 25 this->img = _img; 26} 27 28cv::Mat ImgInfo::GetHsvImg() { 29 return this->hsvImg; 30} 31void ImgInfo::SetHsvImg(cv::Mat _hsv_img) { 32 this->hsvImg = _hsv_img; 33}

ImgProcess

1class ImgProcess 2{ 3public: 4 //Ctor/Dtor 5 ImgProcess(); 6 ~ImgProcess(); 7 8 //public method 9 void ImgInput(cv::Mat img); 10 11private: 12 ImgInfo imginfo; 13}; 14 15void ImgProcess::ImgInput(cv::Mat img) { 16 cv::Mat hsv_img; 17 cv::cvtColor(img, hsv_img, CV_BGR2HSV); 18 imginfo.SetHsvImg(hsv_img); 19} 20

###追記
試した見たところ、以下の状態では正常に動きました。

int main(int argc, char** argv[]) { char imgname[400]; ImgInfo imginfo; ImgProcess imgprocess; std::ofstream LValueFile("BValueFile.csv"); for (int i = 0; i < 125; i++) { sprintf_s(imgname, "c:\Users\osumi\Documents\Yuki Tsuchiya\programs\ObjectHeight\ObjectHeight\img_%d.jpg", i); imginfo.SetImg(cv::imread(imgname, CV_LOAD_IMAGE_COLOR)); if (imginfo.GetImg().empty()) return -1; imgprocess.ImgInput(imginfo.GetImg()); cv::namedWindow("hsvimg", cv::WINDOW_AUTOSIZE); cv::imshow("hsvimg",imginfo.GetImg()); ///←GetHsvImg()を変更 cv::waitKey(30); } return 0; }
int main(int argc, char** argv[]) { char imgname[400]; ImgInfo imginfo; ImgProcess imgprocess; std::ofstream LValueFile("BValueFile.csv"); for (int i = 0; i < 125; i++) { sprintf_s(imgname, "c:\Users\osumi\Documents\Yuki Tsuchiya\programs\ObjectHeight\ObjectHeight\img_%d.jpg", i); imginfo.SetImg(cv::imread(imgname, CV_LOAD_IMAGE_COLOR)); if (imginfo.GetImg().empty()) return -1; cv::Mat hsvimg; cvtColor(imginfo.GetImg(), hsvimg, CV_BGR2HSV);  ///←imgperocess.Imginput(imginfo.GetImg())の内容を表示 cv::namedWindow("hsvimg", cv::WINDOW_AUTOSIZE); cv::imshow("hsvimg",hsvimg); cv::waitKey(30); } return 0; }

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

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

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

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

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

guest

回答2

0

ベストアンサー

ImgProcess::ImgInput()では,
ImgProcessクラスのメンバであるimginfoに対して
imginfo.SetHsvImg(hsv_img);
を行っています.

他方,main関数の末尾では,
cv::imshow("hsvimg",imginfo.GetHsvImg());
として,関数内のローカルなオブジェクトであるimginfoからHSV画像を取得しようとしています.
その結果は空のMatでしょうから,imshow()で例外が発生しているのでしょう.

投稿2019/06/17 09:32

fana

総合スコア11658

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

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

fana

2019/06/17 09:38

> クラス分けをする とされているので,「想定しているクラスの分け方」があるのだと思うのですが, 各クラスの役割がいまいち読み取れませんので,どこをどう直すと良いのか(=想定されている形になるのか)の判断がつきません. そのため,問題の原因と思われる事柄のみを述べました.
nigg_1513

2019/06/17 10:45

回答ありがとうございます。 現状、学習のため、「とりあえず」という形でクラスを分けております。そのため、全くできてはいませんがオブジェクト指向型プログラミングで構築できたらと考えております。 現在、想定している形としては、ImgProcessにおいても、main関数においても、共通のImgInfo内のプライベート関数から情報を取得したいと考えております。 そのような場合、どのように対処を行えば良いのでしょうか。お時間がありましたら、回答していただけると助かります。
fana

2019/06/17 11:29

件の例外に対処するだけならまぁどうとでもやれば良いと思うのですが… 例えば… 現コードではImgInfoのインスタンスがmain内のとImgProcessのメンバとで2つあるわけですが, ImgProcessがメンバとして持っている側を廃止し,ImgProcess::ImgInput()は「ImgInfoの参照を引数に受けて,そのImgInfoが持つMat(HSV側)を更新する」という話にするとか…? (構造体とそれを扱う関数 の形ですね.「クラスを使ってみる」的な話として見ると非常に面白くない形に見える)
nigg_1513

2019/06/18 00:57

ありがとうございます。 そのような形で、構築し直してみようと思います! まずは、原因が特定できて一安心です。ありがとうございました!!!
guest

0

まず、デバッグモードで

c++

1 imginfo.SetImg(cv::imread(imgname, CV_LOAD_IMAGE_COLOR)); 2

にブレークポイントをセットして動作。
F10キーで次に移る際にエラーならばファイルの位置(パス)が問題。
できれば

c++

1 sprintf_s(imgname, "img_%d.jpg", i);

の中にパスも加えれ記述

c++

1 sprintf_s(imgname, "c:\hoge\img_%d.jpg", i);

してみてください。

投稿2019/06/14 08:01

MasahikoHirata

総合スコア3747

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

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

nigg_1513

2019/06/17 04:25

回答ありがとうございます。返信がおそくなり、申し訳ございません。 パスを加え実行してみましたが、改善されませんでした。 imshowにおいて、対象をimginfo.GetImg()で行った場合はしっかりと画面に表示されます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問