软件工程实习---OpenCV实现简易抠图

OpenCV的函数库功能很强大,抠图全程用到的函数在函数库里都可以找到。

最重要的几个函数是:grabcut(  ),compare(  ),copyTo()

具体的函数介绍这里就不再赘述,我会在文末放上链接,如果需要的话自己研究一下。


老师要求的功能是:读入图片后,用一个框给出目标,然后通过边缘迭代得到框中的目标,最后输出目标图像结果(即抠图的结果)


原图:

软件工程实习---OpenCV实现简易抠图_第1张图片


扣图:

软件工程实习---OpenCV实现简易抠图_第2张图片


源代码:

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include "highgui.h"
#include "cv.h"
#include "features2d/features2d.hpp"
#include "opencv/cxcore.hpp" 
#include "cvaux.h"
 
using namespace cv;
 

int main(int , char** argv)
{

	// 打开另一幅图像
	cv::Mat image = cv::imread("bear.jpg", IMREAD_COLOR);
	if (!image.data)
	{
		printf("不能打开图像!\n");
		return 0;
	}
	imshow("image", image);
	// 矩形外的像素是背景 
	cv::Rect rectangle(30, 30, image.cols - 10, image.rows - 10);

	cv::Mat result;
	//两个临时矩阵变量,作为算法的中间变量使用,不用care
	cv::Mat bgModel, fgModel;
	double tt = cv::getTickCount();
	// GrabCut 分段
	cv::grabCut(image,    //输入图像
		result,   //分段结果
		rectangle,// 包含前景的矩形 
		bgModel, fgModel, // 前景、背景
		2,        // 迭代次数
		cv::GC_INIT_WITH_RECT); // 用矩形
	tt = cv::getTickCount() - tt;
	printf("算法执行执行时间:%g ms\n", tt / cv::getTickFrequency() * 1000);
	// 得到可能是前景的像素
	//比较函数保留值为GC_PR_FGD的像素
	cv::compare(result, cv::GC_PR_FGD, result, cv::CMP_EQ);
	// 产生输出图像
	cv::Mat foreground(image.size(), CV_8UC3);
	//背景值为 GC_BGD=0,作为掩码
	image.copyTo(foreground, result);
	//cv::Mat resultImg(image.size(),)

	imshow("result", foreground);
	waitKey(0); // Wait for a keystroke in the window
	return 0;
}
 


拓展链接:

OpenCV笔记:compare()函数介绍 - CSDN博客  https://blog.csdn.net/woainishifu/article/details/62427799?fps=1&locationNum=2


基础学习笔记之opencv(16):grabcut使用例程 - tornadomeet - 博客园  http://www.cnblogs.com/tornadomeet/archive/2012/11/09/2763271.html


Opencv Mat c++ copyto 将一个图像复制到另一个图像的兴趣区域_任薛纪_新浪博客  http://blog.sina.com.cn/s/blog_609a90280101jsh5.html

你可能感兴趣的:(软工实习)