私はグラブカットのサンプルコードを使用しています。それは完全に機能しています。しかし、私の質問は、必要な反復後に最終画像を保存するにはどうすればよいかということです。セグメント化された画像を保存するには、サンプル コードに何行のコードを追加すればよいですか?
1 に答える
「grabcut サンプル コード」と言うのは少しあいまいですが、OpenCV github repoのサンプルを参照していると仮定します。
お探しの機能はimwrite
. 関数のシグネチャは
bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>() );
ここで、filename
は出力ファイル、img
は保存する OpenCV 構造、params
はフラグです (これらの意味は、保存しようとしている画像形式によって異なります)。ここでドキュメントを読んで全体像を把握できます。また、OpenCV のイメージ IO 関数の全体像については、こちらを参照してください。
github サンプルのコンテキストでは、すべての反復が実行された後、最終的にセグメント化された画像を保存する必要があると思われます。ただし、セグメント化された画像はGCApplication
クラスのプライベート メンバーとして保存されるため、アクセスするには少し手間がかかります。いくつかの方法でこれを行うことができます (これよりもはるかにエレガントです) が、手早く汚い方法は次の行を追加することです。
//fill in whatever filename you want here
std::string filename = "grab_seg.png";
cv::imwrite(filename, res);
メソッドの最後までshowImage()
(たとえば、130 行目あたり)。これにより、各反復の最後に表示されるセグメント化された画像が書き出されます。出力画像は毎回上書きされ、最終的には最終的なセグメンテーションが残ります。
免責事項として、これはテストされていません。また、これは github のサンプルに基づいて作業していることを前提として書かれているため、多少の誤解は避けてください。
編集:あなたのコメントに関して、これは(軽く)変更されたshowImage
方法です。最終的にセグメント化された画像をディスクに保存したい場合に必要な変更はこれだけです
void GCApplication::showImage() const
{
//same as in the github sample...
//...
imshow( *winName, res );
//the only addition to the code. Writes a PNG image out to the current directory
std::string fname = "grabcut_img.png";
imwrite(fname, res);
}