opencv基础操作-1117

#识别圆圈

#include <iostream>
#include <math.h>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;


int main(int argc, char* argv[])
{
	Mat src = imread("thecell.jpg");
	//Mat src = imread("1.PNG");
	Mat edge_img;
	if (!src.data)
	{
		cout << "cannot open image" << endl;
		return -1;
	}

	Mat moutput;
	medianBlur(src, moutput, 3);
	cvtColor(moutput, moutput, COLOR_BGR2GRAY);


	vector<Vec3f> pcircles;
	//创建向量存储检测结果
	HoughCircles(moutput, pcircles, HOUGH_GRADIENT, 1, 15, 30, 35, 15, 50);
	//检测圆
	Scalar color = Scalar(0, 255, 0);
	for (size_t i = 0; i < pcircles.size(); i++)
	{
		Vec3f cc = pcircles[i];
		circle(src, Point(cc[0], cc[1]), cc[2], color, 2);
		circle(src, Point(cc[0], cc[1]), 2, color, 2);
	}
	imshow("OUTPUT", src);

	waitKey(0);

	return 0;
}

#几何形状识别之多边形逼近

#include <opencv2/opencv.hpp>
#include <iostream>

#define MATCHMETHOD TM_SQDIFF_NORMED//宏定义匹配模式
using namespace cv;
using namespace std;


int main(int argc, char** argv)
{
	Mat src = imread("circle.jpg");
	Mat src_gray, binary;
	Mat Triangle = src.clone(), Rect = src.clone(), BigCircle = src.clone(), SmallCircle = src.clone();
	if (src.empty()) {
		printf("Could not load image...");
		return -1;
	}
	imshow("Input Image", src);

	//二值化
	cvtColor(src, src_gray, COLOR_BGR2GRAY);
	threshold(src_gray, binary, 0, 255, THRESH_BINARY | THRESH_OTSU);
	binary = ~binary;
	imshow("binary", binary);

	//发现轮廓
	vector<vector<Point>> contours;
	vector<Point> point;
	vector<Vec4i> hireachy;
	findContours(binary, contours, hireachy, RETR_TREE, CHAIN_APPROX_SIMPLE, Point());

	//绘制出所有轮廓
	for (size_t t = 0; t < contours.size(); t++)
	{

		int epsilon = 0.01*arcLength(contours[t], true);
		approxPolyDP(contours[t], point, epsilon, true);
		if (point.size() == 3)
		{
			drawContours(Triangle, contours, t, Scalar(0, 0, 255), 2, 8, Mat(), 0, Point());//dst必须先初始化
		}
		else if (point.size() == 4)
		{
			drawContours(Rect, contours, t, Scalar(0, 0, 255), 2, 8, Mat(), 0, Point());//dst必须先初始化
		}

		else
		{
			double area = contourArea(contours[t]);
			if (area < 15000)
			{
				drawContours(SmallCircle, contours, t, Scalar(0, 0, 255), 2, 8, Mat(), 0, Point());//dst必须先初始化
			}
			else
			{
				drawContours(BigCircle, contours, t, Scalar(0, 0, 255), 2, 8, Mat(), 0, Point());//dst必须先初始化
			}
		}

		cout << "边的数目:" << point.size() << endl;
	}

	imshow("Triangle", Triangle);
	imshow("BigCircle", BigCircle);
	imshow("Rect", Rect);
	imshow("SmallCircle", SmallCircle);

	waitKey(0);

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值