我正在使用抓取示例代码。它运行良好。但我的问题是,如何在所需的迭代后保存最终图像。我应该在示例代码中添加哪些代码行来保存分段图像?
问问题
695 次
1 回答
2
说“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);
}
于 2013-06-18T00:00:14.037 回答