-1

我正在使用抓取示例代码。它运行良好。但我的问题是,如何在所需的迭代后保存最终图像。我应该在示例代码中添加哪些代码行来保存分段图像?

4

1 回答 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 回答