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
批处理