OpenCV实现图像物体轮廓,前景背景,标记,并保存。

#include <iostream> // for standard I/O
#include <string>   // for strings
#include <iomanip>  // for controlling float print precision
#include <sstream>  // string to number conversion 

#include <opencv2/imgproc/imgproc.hpp>  // Gaussian Blur
#include <opencv2/core/core.hpp>        // Basic OpenCV structures (cv::Mat, Scalar)
#include <opencv2/highgui/highgui.hpp>  // OpenCV window I/O

using namespace std;
using namespace cv;

// images
Mat inputImg, showImg, segMask, segShowImg;

// mask
Mat fgScribbleMask, bgScribbleMask;

// user clicked mouse buttons flags
bool rButtonDown = false;
bool lButtonDown = false;
int scribbleRadius = 5;

// mouse listener
static void onMouse( int event, int x, int y, int, void* )
{
	//cout << "On Mouse: (" << x << "," << y << ")" <<endl;

	if (event == CV_EVENT_LBUTTONDOWN)
	{
		lButtonDown = true;

	}
	else if (event == CV_EVENT_RBUTTONDOWN)
	{
		rButtonDown = true;

	}
	else if (event == CV_EVENT_LBUTTONUP)
	{
		lButtonDown = false;
	}
	else if (event == CV_EVENT_RBUTTONUP)
	{
		rButtonDown = false;
	}
	else if (event == CV_EVENT_MOUSEMOVE)
	{
		if (rButtonDown)
		{
			// scribble the background

			circle(bgScribbleMask,Point(x,y),scribbleRadius, 255,-1);
			circle(showImg,Point(x,y),scribbleRadius, CV_RGB(0,0,255),-1);

		}
		else if (lButtonDown)
		{
			// scribble the foreground

			circle(fgScribbleMask,Point(x,y),scribbleRadius, 255,-1);
			circle(showImg,Point(x,y),scribbleRadius, CV_RGB(255,0,0),-1);

			//fgScribbleMask.at<char>(y,x)=(char)255;
			// set variables using mask
			//showImg.setTo(redColorElement,fgScribbleMask);

			//showImg.at<Vec3b>(y,x)[0] = 0;
			//showImg.at<Vec3b>(y,x)[1] = 0;
			//showImg.at<Vec3b>(y,x)[2] = 255;
		}

	}

	imshow("Scribble Image", showImg);
	imshow("fg mask", fgScribbleMask);
	imshow("bg mask", bgScribbleMask);
}

// clear everything before closing
void destroyAll()
{
	// destroy all windows
	destroyWindow("Input Image");
	destroyWindow("Scribble Image");

	destroyWindow("bg mask");
	destroyWindow("fg mask");
	destroyWindow("Segmentation Mask");
	destroyWindow("Segmentation Image");

	// clear all data
	fgScribbleMask.release();
	bgScribbleMask.release();
	inputImg.release();
	showImg.release();

	segMask.release();
	segShowImg.release();

}

// init all images/vars
int init(char * imgFileName)
{
	// Read the file
	inputImg = imread(imgFileName, CV_LOAD_IMAGE_COLOR);
	showImg = inputImg.clone();
	segShowImg = inputImg.clone();

	// Check for invalid input
	if(!inputImg.data )
	{
		cout <<  "Could not open or find the image: " << imgFileName << std::endl ;
		return -1;
	}

	// this is the mask to keep the user scribbles
	fgScribbleMask.create(2,inputImg.size,CV_8UC1);
	fgScribbleMask = 0;
	bgScribbleMask.create(2,inputImg.size,CV_8UC1);
	bgScribbleMask = 0;
	segMask.create(2,inputImg.size,CV_8UC1);
	segMask = 0;

	// Create a window for display.
	namedWindow( "Input Image", CV_WINDOW_AUTOSIZE );
	namedWindow( "Scribble Image", CV_WINDOW_AUTOSIZE);

	namedWindow( "fg mask", CV_WINDOW_AUTOSIZE );
	namedWindow( "bg mask", CV_WINDOW_AUTOSIZE );

	// Show our image inside it.
	imshow( "Input Image", inputImg );
	imshow( "Scribble Image", showImg );  

	imshow("fg mask", fgScribbleMask);
	imshow("bg mask", bgScribbleMask);

	moveWindow("Scribble Image", 1,1);
	moveWindow("Input Image", inputImg.cols + 50,1);
	moveWindow("Bin Per Pixel", 2*(inputImg.cols + 50),1);
	moveWindow("Edges", 2*(inputImg.cols + 55),1);

	// set the callback on mouse
	setMouseCallback("Scribble Image", onMouse, 0);

	return 0;
}

int main(int argc, char *argv[])
{

	String image_name,numBinsStr,bhaSlopeStr;
	cout<<"input Parameters:"<<endl;
	cout<<"image name: ";
	cin>>image_name;

	// get img name parameter
	char * imgFileName = (char *)image_name.c_str();

	if (init(imgFileName)==-1)
	{
		cout <<  "Could not initialize" << endl ;
		return -1;
	}

	// Wait for a keystroke in the window
	for (;;)
	{
		char key = waitKey(0);
		switch (key)
		{
		case 'q':
			cout << "goodbye" << endl;
			destroyAll();
			return 0;
		case '-':
			//缩小画笔直径
			if (scribbleRadius > 2)
				scribbleRadius --;
			cout << "current radius is " << scribbleRadius << endl;
			break;
		case '+':
			if (scribbleRadius < 100)
				scribbleRadius ++;
			cout << "current radius is " << scribbleRadius << endl;
			break;
		case 's':
			{

				// this is where we store the results
				segMask = 0;
				inputImg.copyTo(segShowImg);
				//inputImg.copyTo(showImg);

				imwrite("bg.bmp",bgScribbleMask);

				break;

			}
		case 'r':
			{
				cout << "resetting" << endl;
				destroyAll();
				if (init(imgFileName)==-1)
				{
					cout <<  "could not initialize" << std::endl ;
					return -1;
				}
				break;
			}
		}
	}

	return 0;
}
时间: 2024-08-31 07:50:12

OpenCV实现图像物体轮廓,前景背景,标记,并保存。的相关文章

库函数-opencv中图像轮廓矢量化算法

问题描述 opencv中图像轮廓矢量化算法 opencv中图像轮廓矢量化算法,有直接矢量化的库函数么?急求答案! 解决方案 说的有点含糊,如果你是要opencv中的代码,你可以直接抠出来用.

OpenCV 查找图像轮廓

OpenCV 查找图像轮廓 目的 我们将学习: 学会使用 OpenCV 函数 findContours 学会使用 OpenCV 函数 drawContours 原理 代码 下面是本示例的代码,可以从这里 下载 #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> #

利用OpenCV检测图像中的长方形画布或纸张并提取图像内容

原文:利用OpenCV检测图像中的长方形画布或纸张并提取图像内容 基于知乎上的一个答案.问题如下: 也就是在一张照片里,已知有个长方形的物体,但是经过了透视投影,已经不再是规则的长方形,那么如何提取这个图形里的内容呢?这是个很常见的场景,比如在博物馆里看到一幅很喜欢的画,用手机找了下来,可是回家一看歪歪斜斜,脑补原画内容又觉得不对,那么就需要算法辅助来从原图里提取原来的内容了.不妨把应用的场景分为以下: 纸张四角的坐标(图中红点)已知的情况 也就是上面的左图中4个红点是可以准确获取,比如手动标注

使用Python+OpenCV进行图像模板匹配(Match Template)

本篇文章介绍使用Python和OpenCV对图像进行模板匹配和识别.模板匹配是在图像中寻找和识别模板的一种简单的方法.以下是具体的步骤及代码. 首先导入所需库文件,numpy和cv2. #导入所需库文件  import cv2  import numpy as np  然后加载原始图像和要搜索的图像模板.OpenCV对原始图像进行处理,创建一个灰度版本,在灰度图像里进行处理和查找匹配.然后使用相同的坐标在原始图像中进行还原并输出. #加载原始RGB图像  img_rgb = cv2.imread

OpenCV中图像融合

     准备2副背景图像,注意图像黑色的部分,是作为mask用的,我们会用灰度图的方式打开它们,这时黑色的部分值为0,则图像融合时候,可以把第二幅图像在黑色的部分显示出来. 代码非常简单,注意就是图像copyTo函数的使用,把背景图像copy到前景图像时候,掩码部分不会拷贝. CImageEffect::CImageEffect(){ backImage = cv::imread("background.png"); if(!backImage.data) QMessageBox::

opencv里图像批处理保存

问题描述 opencv里图像批处理保存 opencv里想在一个for循环里imwrite多张图片,保存为不同的文件名,可以实现吗? 解决方案 matlab里可以,opencv没试过,应该也可以的 解决方案二: 嗯,已经解决了,用sprintf每次写一个新路径名 解决方案三: opencv保存图像

c++-利用OpenCV比较图像旋转角度

问题描述 利用OpenCV比较图像旋转角度 有两个图,已经加载到Mat中,期中的一个图是另一个图经过一定的旋转得到的,我想利用OpenCV来获得被旋转图是旋转了多少度.希望各位大虾能给点思路或者方法,谢谢了! 解决方案 不知道我说的符不符合你的情况哈 . 我这边以前也弄过图片旋转, 一张图片经过旋转后,再保存就会发现它的 width 跟height不一样的 , 一般是变大,比如旋转九十度,那么它的宽就成了高了,旋转的角度与宽高变化的关系可以用数学式子整理出来.不知道用在你那上面对不对了 .这只是

opencv-请问OpenCV怎么判断一个轮廓包含在另一个轮廓中呢

问题描述 请问OpenCV怎么判断一个轮廓包含在另一个轮廓中呢 Opencv可以比较容易的找到轮廓,但是如何判断某个轮廓包含在另一个轮廓中呢

日历添加提醒-如何将给日历背景标注永久保存?

问题描述 如何将给日历背景标注永久保存? 最近在做一个包含日历提醒功能的应用,需要给日历某个日期添加背景标注,就是一个圆圈?的背景,但是标注之后退出应用再进入应用就看不到以前添加的背景标注了,该怎么永久保存添加的背景标注呢?除非卸载了. 解决方案 需要写入文件或者数据库.用面向对象的数据结构保存你的绘图动作,并且序列化. 解决方案二: ???????????????