• 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;
    }

  • 相关阅读:
    yum配置163源
    sed
    Python3.6 提示 ModuleNotFoundError: No module named '_ssl' 模块问题
    django上传excel文件
    OpenStack Train版-7.neutron网络服务概述
    OpenStack Train版-6.安装nova计算服务(计算节点)
    OpenStack Train版-5.安装nova计算服务(控制节点)
    OpenStack Train版-4.安装placement放置服务
    OpenStack Train版-3.安装glance镜像服务
    OpenStack Train版-2.安装keystone身份认证服务
  • 原文地址:https://www.cnblogs.com/wuyida/p/6301436.html
Copyright © 2020-2023  润新知