zoukankan      html  css  js  c++  java
  • Square Detector

    the first demo for OpenCV

    #inlucde<opencv2opencv.hpp>
    using namespace cv;
    int main()
    {
    	Mat picture=imread("wallpaper")
    	imshow("测试程序",picture);
    	waitKey(20180717);
    }
    

    Script diagnosis requires some permissions to be installed on their folders.Do you want to fix this question?

    First Column Second Column
    wallpaper 墙纸
    static 静止的['staetik]
    absolute ['aebse lut]绝对的,完全的
    omitted [ou'mitid]遗漏的
    omit [e'mit]省略,遗漏
    pyramid ['piremid]金字塔
    image pyramid 图像金字塔
    scale [skel]规模
    scaling ['skeling]缩放比例,尺度
    pyramid scaling
    contour ['ka:ntur]外形,轮廓
    guassian pyramid 高斯金字塔
    diagnosis [daieg'nousis]诊断
    fix the question 修复问题
    diagnostic 诊断的
    diagnostics 诊断学
    counter simplification 轮廓简化[simplefe'keition]
    memory storage 存储装置
    folks 人们
    sequence [si:kwens]顺序
    specified 指定的
    dG vim(delete all the lines behind the current line)
    d$ vim(delete the cursor position to the end of the line)
    cursor ['ke:rse(r)]光标

    OpenCV read the picture path(The "Square Detector" program)

    // The "Square Detector" program.
    // It loads several images sequentially and tries to find squares in
    // each image
    
    #include "opencv2/core/core.hpp"
    #include "opencv2/imgproc/imgproc.hpp"
    #include "opencv2/imgcodecs.hpp"
    #include "opencv2/highgui/highgui.hpp"
    
    #include <iostream>
    #include <math.h>
    #include <string.h>
    
    using namespace cv;
    using namespace std;
    
    static void help()
    {
    	cout <<
    		"
    A program using pyramid scaling, Canny, contours, contour simplification and
    "
    		"memory storage (it's got it all folks) to find
    "
    		"squares in a list of images pic1-6.pn1g
    "
    		"Returns sequence of squares detected on the image.
    "
    		"the sequence is stored in the specified memory storage
    "
    		"Call:
    "
    		"./squares
    "
    		"Using OpenCV version %s
    " << CV_VERSION << "
    " << endl;
    }
    
    
    int thresh = 50, N = 11;
    const char* wndname = "Square Detection Demo";
    
    // helper function:
    // finds a cosine of angle between vectors
    // from pt0->pt1 and from pt0->pt2
    static double angle(Point pt1, Point pt2, Point pt0)
    {
    	double dx1 = pt1.x - pt0.x;
    	double dy1 = pt1.y - pt0.y;
    	double dx2 = pt2.x - pt0.x;
    	double dy2 = pt2.y - pt0.y;
    	return (dx1*dx2 + dy1*dy2) / sqrt((dx1*dx1 + dy1*dy1)*(dx2*dx2 + dy2*dy2) + 1e-10);
    }
    
    // returns sequence of squares detected on the image.
    // the sequence is stored in the specified memory storage
    static void findSquares(const Mat& image, vector<vector<Point> >& squares)
    {
    	squares.clear();
    
    	Mat pyr, timg, gray0(image.size(), CV_8U), gray;
    
    	// down-scale and upscale the image to filter out the noise
    	pyrDown(image, pyr, Size(image.cols / 2, image.rows / 2));
    	pyrUp(pyr, timg, image.size());
    	vector<vector<Point> > contours;
    
    	// find squares in every color plane of the image
    	for (int c = 0; c < 3; c++)
    	{
    		int ch[] = { c, 0 };
    		mixChannels(&timg, 1, &gray0, 1, ch, 1);
    
    		// try several threshold levels
    		for (int l = 0; l < N; l++)
    		{
    			// hack: use Canny instead of zero threshold level.
    			// Canny helps to catch squares with gradient shading
    			if (l == 0)
    			{
    				// apply Canny. Take the upper threshold from slider
    				// and set the lower to 0 (which forces edges merging)
    				Canny(gray0, gray, 0, thresh, 5);
    				// dilate canny output to remove potential
    				// holes between edge segments
    				dilate(gray, gray, Mat(), Point(-1, -1));
    			}
    			else
    			{
    				// apply threshold if l!=0:
    				//     tgray(x,y) = gray(x,y) < (l+1)*255/N ? 255 : 0
    				gray = gray0 >= (l + 1) * 255 / N;
    			}
    
    			// find contours and store them all as a list
    			findContours(gray, contours, RETR_LIST, CHAIN_APPROX_SIMPLE);
    
    			vector<Point> approx;
    
    			// test each contour
    			for (size_t i = 0; i < contours.size(); i++)
    			{
    				// approximate contour with accuracy proportional
    				// to the contour perimeter
    				approxPolyDP(Mat(contours[i]), approx, arcLength(Mat(contours[i]), true)*0.02, true);
    
    				// square contours should have 4 vertices after approximation
    				// relatively large area (to filter out noisy contours)
    				// and be convex.
    				// Note: absolute value of an area is used because
    				// area may be positive or negative - in accordance with the
    				// contour orientation
    				if (approx.size() == 4 &&
    					fabs(contourArea(Mat(approx))) > 1000 &&
    					isContourConvex(Mat(approx)))
    				{
    					double maxCosine = 0;
    
    					for (int j = 2; j < 5; j++)
    					{
    						// find the maximum cosine of the angle between joint edges
    						double cosine = fabs(angle(approx[j % 4], approx[j - 2], approx[j - 1]));
    						maxCosine = MAX(maxCosine, cosine);
    					}
    
    					// if cosines of all angles are small
    					// (all angles are ~90 degree) then write quandrange
    					// vertices to resultant sequence
    					if (maxCosine < 0.3)
    						squares.push_back(approx);
    				}
    			}
    		}
    	}
    }
    
    
    // the function draws all the squares in the image
    static void drawSquares(Mat& image, const vector<vector<Point> >& squares)
    {
    	for (size_t i = 0; i < squares.size(); i++)
    	{
    		const Point* p = &squares[i][0];
    		int n = (int)squares[i].size();
    		polylines(image, &p, &n, 1, true, Scalar(0, 255, 0), 3, LINE_AA);
    	}
    
    	imshow(wndname, image);
    }
    
    
    int main(int /*argc*/, char** /*argv*/)
    {
    	static const char* names[] = { "D:/OpenCV 3.1/opencv/sources/samples/data/pic1.png",
    		"D:/OpenCV 3.1/opencv/sources/samples/data/pic2.png",
    		"D:/OpenCV 3.1/opencv/sources/samples/data/pic3.png",
    		"D:/OpenCV 3.1/opencv/sources/samples/data/pic4.png", 
    		"D:/OpenCV 3.1/opencv/sources/samples/data/pic5.png", 
    		"D:/OpenCV 3.1/opencv/sources/samples/data/pic6.png", 0 };
    	help();
    	namedWindow(wndname, 1);
    	vector<vector<Point> > squares;
    
    	for (int i = 0; names[i] != 0; i++)
    	{
    		Mat image = imread(names[i], 1);
    		if (image.empty())
    		{
    			cout << "Couldn't load " << names[i] << endl;
    			continue;
    		}
    
    		findSquares(image, squares);
    		drawSquares(image, squares);
    
    		int c = waitKey();
    		if ((char)c == 27)
    			break;
    	}
    
    	return 0;
    }
    
    • Absolute Path:It's the path starting from the disk,like——D:OpenCV 3.1opencvsourcessamplesdatapic1.png

    • Relative Path:It's the path starting from the current path,if the current path is "E:VS2015ConsoleApplication1ConsoleApplication1"

    • If you want to describe the path(E:VS2015ConsoleApplication1ConsoleApplication1pic1.png),just input the relative path"pic1.png".In fact,the strict relative path writing should be ".pic1.png".

    • "./"(It means that the current path can be omitted under normal)

    • //The "Square Detector" program
    • //It loads several images sequentially and tries to find squares in
    • //each image
    static const char* names[] = { 
    		"D:/OpenCV 3.1/opencv/sources/samples/data/pic1.png",
    		"D:/OpenCV 3.1/opencv/sources/samples/data/pic2.png",
    		"D:/OpenCV 3.1/opencv/sources/samples/data/pic3.png",
    		"D:/OpenCV 3.1/opencv/sources/samples/data/pic4.png", 
    		"D:/OpenCV 3.1/opencv/sources/samples/data/pic5.png", 
    		"D:/OpenCV 3.1/opencv/sources/samples/data/pic6.png", 0 };
    	
    

    Warning:"ConsoleApplication1.exe"(Win32):loaded,"C:WindowsSystem32 tdll.dll".Unable to find or open the pdb file.

    pdb file(be used to help the debugging of the software)
    
  • 相关阅读:
    Tomcat解压war包错误
    排序规则
    JSONArray中按字段排序
    Spring Boot中使用Java线程池ExecutorService
    Vert X 干法总结
    MySQL数据库表分区功能详解
    Kubernetes概念,架构,运行一个pod流程
    Java代理模式
    virtualbox下设置虚拟机与主机互通且虚拟机可联网的方法
    entos 如何查看操作系统是哪个版本
  • 原文地址:https://www.cnblogs.com/hugeng007/p/9326058.html
Copyright © 2011-2022 走看看