识别形状
有九个图案和最外面的正方形轮廓,识别出10个轮廓形状和每个轮廓的重心坐标。
#include<opencv2/opencv.hpp>
#include<opencv2\legacy\legacy.hpp>
#include<vector>
#include<iostream>
double angle(cv::Point pt1, cv::Point pt2, cv::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);
}
int main()
{
cv::Mat srcImg, tempImg,gary,thresh,srcImg1;
cv::Mat dstImg;
int j = 0;
double s = 0;
srcImg = cv::imread("90.bmp");
if (!srcImg.data)
{
std::cout << "no img" << std::endl;
return -1;
}
//图片处理
resize(srcImg, srcImg, cv::Size(srcImg.cols / 2, srcImg.rows / 2), 0, 0);//缩放
cvtColor(srcImg, gary, CV_RGB2GRAY);//灰度图
medianBlur(gary, gary, 3);//中值滤波
threshold(gary, thresh, 0, 255, cv::THRESH_OTSU);//二值化
srcImg1 = thresh.clone();
dstImg = cv::Mat(srcImg.size(), CV_8UC3, cv::Scalar(255, 255, 255));
//寻找轮廓
std::vector<std::vector<cv::Point>>contours;
findContours(srcImg1, contours, CV_RETR_TREE, CV_CHAIN_APPROX_NONE);
std::vector<cv::Point>approx;
//圆
std::vector<cv::Vec3f>circles;
HoughCircles(gary, circles, CV_HOUGH_GRADIENT, 1, srcImg.rows / 2, 100, 60, 0, 0);//单通道
for (size_t i = 0; i < circles.size(); i++)
{
cv::Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
circle(dstImg, center, radius, cv::Scalar(0, 255, 0), 5, 8, 0);
circle(dstImg, center, 3, cv::Scalar(0, 255, 0), -1);
std::cout << "圆心" << i + 1 << center << std::endl;
}
//菱形
std::vector<cv::Point>squares;
//长方形
std::vector<cv::Point>changfang;
//正方形
std::vector<cv::Point>zhengfang;
//三角形
std::vector<cv::Point>sanjiao;
//五角星
std::vector<cv::Point>wujiao;
//五边形
std::vector<cv::Point>wubian;
//十字形
std::vector<cv::Point>shizi;
//梅花形
std::vector<cv::Point>meihua;
//画四边形
double t;
for (size_t i = 0; i < contours.size(); i++)
{
drawContours(dstImg, contours, i, cv::Scalar(100, 100, 100), 3);
approxPolyDP(contours[i], approx, arcLength(cv::Mat(contours[i]), true)*0.02, true);
if (approx.size() == 4 && fabs(contourArea(cv::Mat(approx))) >