模块笔记(不能直接运行,仅供个人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;
}