执行grabcut opencv示例代码后保存图像

时间:2013-06-17 22:45:00

标签: opencv

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

1 个答案:

答案 0 :(得分:2)

说“抓取样本代码”有点模棱两可,但我假设你在the OpenCV github repo指的是样本。

您正在寻找的功能是imwrite。函数签名是

bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>() );

其中filename是输出文件,img是要保存的OpenCV结构,params是标志(它们的含义取决于您的图像格式)重新尝试保存为)。您可以阅读文档以获得更全面的图片here。您还可以在OpenCV here中更全面地了解图像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);
}