调用opencv grabcut写一个C++程序
时间: 2023-11-29 14:05:29 浏览: 96
好的,以下是一个使用OpenCV中的GrabCut算法实现前景提取的C++程序:
```c++
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main() {
Mat image = imread("input.jpg"); // 读入输入图像
Mat mask(image.size(), CV_8UC1, Scalar(GC_PR_BGD)); // 创建掩码,初始值为背景
Rect roi(100, 100, 300, 300); // 创建ROI,用于初始化前景区域
mask(roi).setTo(Scalar(GC_PR_FGD)); // 将ROI中的像素标记为前景
Mat bgdModel, fgdModel; // 存储背景和前景模型的矩阵
grabCut(image, mask, roi, bgdModel, fgdModel, 5, GC_INIT_WITH_RECT); // 进行GrabCut算法
Mat foregroundMask = (mask == GC_PR_FGD) | (mask == GC_FGD); // 提取前景掩码
Mat foreground(image.size(), CV_8UC3, Scalar(0, 0, 0)); // 创建前景图像
image.copyTo(foreground, foregroundMask); // 将前景掩码应用到原图像中
imshow("Input Image", image); // 显示输入图像
imshow("Foreground Mask", foregroundMask); // 显示前景掩码
imshow("Foreground", foreground); // 显示前景图像
waitKey(); // 等待用户按下按键
return 0;
}
```
在这个程序中,我们首先读入输入图像`input.jpg`,然后创建一个与图像大小相同、初始值为背景的掩码。我们还创建了一个ROI(感兴趣区域),并将其内的像素标记为前景。然后我们调用`grabCut`函数,运行GrabCut算法,得到前景掩码。最后,我们将前景掩码应用到原图像中,得到前景图像,并显示输入图像、前景掩码和前景图像。
注意:在运行这个程序之前,你需要先安装OpenCV,并将其头文件和库文件链接到你的项目中。
阅读全文