【opencv3---图像的轮廓和矩】

模块笔记(不能直接运行,仅供个人copy使用):



#include<opencv2\opencv.hpp>
#include <iostream>
#include<vector>

using namespace cv;
using namespace std;


bool PointCmpy(cv::Point const& a,cv::Point const& b)
{
  return a.x<b.x;
}
int main()
{

	bool isExactness=false;
	/// 加载源图像
	Mat src;
	src = imread("C:\\Users\\Administrator\\Desktop\\测试图片\\6.jpg",1);
	//src = imread("C:\\Users\\Administrator\\Desktop\\测试图像\\2\\BfImg17(x-247 y--91 z--666)-(492,280).jpg",1);
	cvtColor(src,src,CV_RGB2GRAY);
	
	if(src.empty())
	{
		cout<<"fali"<<endl;
	}
	resize(src,src,cv::Size(496,460),cv::INTER_LINEAR);
	cv::Mat image2,image3,image4,image5;
		medianBlur(image2_6, image2_6, 5);
	medianBlur(image2_6, image2_6, 3);
	imshow("filter",image2_6);
	cv::Mat element0 = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(6, 6));
	for (int i = 0;i<1;i++)
	{
		erode(image2_6, image2_6, element0);	
	}
	//for (int i = 0;i < 1;i++)
	//{
	//	dilate(image2_4, image2_4, element0);
	//}
	imshow("形态学1",image2_6);
	threshold(image2_6, image2_6, 35, 255, cv::THRESH_BINARY);
	imshow("二值化",image2_6);
	bitwise_not(image2_6, image2_6);
	imshow("取反bit",image2_6);
  	std::vector<std::vector<cv::Point> > contours;
	std::vector<std::vector<cv::Point> > max_contours;
	std::vector<cv::Vec4i> hierarchy;
	std::vector<cv::Point2f>mc(1);
	std::vector<cv::Moments>mu(1);
	findContours(image2_6, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cv::Point(0, 0));
	vector<Point>points;//边缘点集合
	vector<Point>centers;
	Point p;//质心的点
	Point center(248,0);
	int index=0;
	if (!contours.empty() && !hierarchy.empty())
	{
		float temparea = 0;
		for (std::vector<std::vector<cv::Point> >::iterator it = contours.begin();it != contours.end();it++)
		{
			if (contourArea(*it) > temparea)
			{
				temparea = contourArea(*it);
			}
		}
		//cout<<"area: "<<temparea<<endl;
		if( temparea>9500)
		{

			isExactness=true;
			   
			for (std::vector<std::vector<cv::Point> >::iterator it = contours.begin();it != contours.end();it++)
			{
				if (contourArea(*it) > temparea-10)
				{
					mu[0] = moments((*it),false);
					mc[0] = Point2d( mu[0].m10/mu[0].m00 , mu[0].m01/mu[0].m00 );
					for(vector<Point>::iterator inter=it->begin();inter!=it->end();inter++)
					{
						if( ((*inter).x == 248) )
						{
							centers.push_back(*inter);//包含上下两个中心点
						}
					}
				}
			}
						Point  p_temp;
			
			std::vector<std::vector<cv::Point> > contours2;
			std::vector<cv::Vec4i> hierarchy2;
			findContours(temp, contours2, hierarchy2, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cv::Point(0, 0));
			if(contours2.size() == 1)
			{
				for(vector<Point>::iterator inter=contours2[0].begin();inter!=contours2[0].end();inter++)
				{
					circle(image4,*inter,2,Scalar(255,255,255),1,8);
				}
			}
			else
			{
				double length=0;
				int index;//最长轮廓的索引号
				for(int i=0;i<contours2.size();i++)
				{
					if(arcLength(Mat(contours2[i]),true)>length)
					{
						length=arcLength(Mat(contours2[i]),true);
						index=i;
					}
				}
				for(vector<Point>::iterator inter=contours2[index].begin();inter!=contours2[index].end();inter++)
				{
					circle(image4,*inter,2,Scalar(255,255,255),1,8);
				}
			}
			



		}
			

	}




    waitKey(0);
	getchar();
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CVer儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值