1、功能
論文圖片處理需要用到簡單的前景目標提取,這裏採用opencv的grabCut函數;
前期可以採用selectROI獲取矩形框(需要添加contrib庫),也可以手動設定rect;
添加了一個圖片批處理操作,glob函數獲取文件夾的圖片。
本文運行環境爲VS2017+OPENCV4.0.1.
2、代碼
#include <opencv2/opencv.hpp>
#include <opencv2/tracking.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
String path = "F:\\插值光流\\RLOF\\RLOFLib-master\\RLOFLib-master\\Doc\\花開動圖\\紅花\\";//待處理
String dest = "F:\\插值光流\\RLOF\\RLOFLib-master\\RLOFLib-master\\Doc\\花開動圖\\紅花2\\";//處理後
String savedfilename;
vector<cv::String> filenames;
Mat srcImg;
//手動設置前景所在區域位置
Rect r = cv::Rect(103, 17, 335, 254);
cv::glob(path, filenames);
for (int i = 0; i < filenames.size(); i++) //filenames.size()
{
srcImg = imread(filenames[i]);
std::cout << filenames[i] << std::endl;
Mat mask;
Mat bgModel, fgModel; // 模型(內部使用)
grabCut(srcImg, mask, r, bgModel, fgModel, 1, cv::GC_INIT_WITH_RECT);
// 得到可能爲前景的像素
compare(mask, GC_PR_FGD, mask, cv::CMP_EQ);
//imshow("mask", mask);
// 生成輸出圖像
Mat foreground(srcImg.size(), CV_8UC3, cv::Scalar(0, 0, 0));//背景爲黑色
srcImg.copyTo(foreground, mask); // 複製背景數據
// 輸出前景圖像結果
//cv::imshow("提取後", foreground);
//imwrite("20_1.png", foreground);//存到本地
savedfilename = dest + filenames[i].substr(65);
std::cout << savedfilename << std::endl;
imwrite(savedfilename, foreground);
}
return 0;
}
3、參考
https://blog.csdn.net/zmdsjtu/article/details/78051804
https://blog.csdn.net/if_i_die_young/article/details/85263256