效果
代码:
#include <iostream>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
// 用GrabCut算法分割图像
// 前面学习了如何利用颜色,根据场景中的特定元素分割图像。
// 物体通常有自己特有的颜色,通过识别颜色接近的区域,通常可以提取出这些颜色。
// 另外OpenCV提供一种常用的分割算法--GrabCut算法,计算量也很大,但结果通常很精确。
//如果要从静态图像中提取前景物体(例如从图像中剪切一个物体,并粘贴到另一幅图像),最好采用GrabCut算法。
using namespace cv;
int main()
{
Mat image = imread("/home/jason/work/01-img/dog.png");
std::cout << "size:" << image.rows << " * " << image.cols << std::endl;
// 定义一个带边框的矩形
//矩形外部的像素会被标记为背景
Rect rectangle(130, 0, 230, 400);
imshow("image", image);
imshow("re", image(rectangle));
Mat result; // 分割结果(四种可能的值)
// 定义两个矩阵,用于存放算法构建的模型
Mat bgModel, fgModel; // 模型(内部使用)
grabCut(image, // 输入图像
result, // 分割结构
rectangle, // 包含前景的矩形
bgModel, fgModel, // 模型
10, // 迭代次数
GC_INIT_WITH_RECT); // 使用带边框的矩形模型
// 取得标记为“可能属于前景”的像素
compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ);
imshow("r2", result);
// 生成输出图像
Mat foreground(image.size(), CV_8UC3, Scalar(255, 255, 255));
image.copyTo(foreground, result); // 不复制背景像素
imshow("r3",foreground);
waitKey(0);
return 0;
}