效果图
实现思路
- 先将图像进行灰度化再进行二值化处理
- 消除噪声,膨胀使物体变大消除硬币内部噪声,开操作消除部分高亮区域
- 据距离变换的性质,经过简单的运算,即可用于细化字符的轮廓和查找物体质心(中心)
- 轮廓查找
代码
#include
#include
int main()
{
cv::Mat src = cv::imread("./1.png");
cv::Mat img = src.clone();
cv::Mat gray;
cv::cvtColor(img, gray, cv::COLOR_BGR2GRAY);
cv::Mat thresh;
cv::threshold(gray, thresh, 127, 255, cv::THRESH_BINARY_INV | cv::THRESH_OTSU);
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
cv::Mat dilate;
cv::morphologyEx(thresh, dilate, cv::MORPH_DILATE, kernel, cv::Point(-1, -1), 5);
cv::Mat opening;
cv::morphologyEx(dilate, opening, cv::MORPH_OPEN, kernel, cv::Point(-1, -1), 3);
cv::Mat dist_transform;
cv::distanceTransform(opening, dist_transform, cv::DIST_L2, 3);
cv::Mat sure_fg;
double minValue, maxValue;
cv::minMaxLoc(dist_transform, &minValue, &maxValue);
cv::threshold(dist_transform, sure_fg, 0.5 * maxValue, 255, cv::THRESH_BINARY);
sure_fg.convertTo(sure_fg, CV_8UC1);
std::vector <std::vector<cv::Point>> contours;
std::vector <cv::Vec4i> hierarchy;
cv::findContours(sure_fg, contours, hierarchy, cv::RETR_LIST, cv::CHAIN_APPROX_NONE);
cv::drawContours(img, contours, -1, (0, 0, 255), 3);
std::stringstream ss;
std::string str;
ss << "count:" << contours.size();
ss >> str;
cv::putText(img, str, cv::Point(0, 30), cv::FONT_HERSHEY_SIMPLEX, 0.5, cv::Scalar(0, 255, 0), 1);
cv::imshow("", img);
cv::waitKey();
return 0;
}