腐蚀
cv::namedWindow("src", cv::WINDOW_NORMAL);
cv::namedWindow("copy", cv::WINDOW_NORMAL);
cv::Mat src(cv::Size(200, 200), CV_8UC1, cv::Scalar(0));
cv::rectangle(src, cv::Rect(30, 30, 9, 9), cv::Scalar(255), -1);
cv::Mat erode;
cv::Mat kernel1 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(9, 9));
morphologyEx(src, erode, cv::MORPH_ERODE, kernel1);
std::vector> contours;
cv::findContours(erode, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
cv::RotatedRect minRect = cv::minAreaRect(contours[0]);
std::cout << "after erode size: " << minRect.boundingRect().tl() - cv::Point(30, 30) << std::endl;
cv::Mat copy(src.size(), src.type(), cv::Scalar(0));
copy.at(minRect.center) = 255;
cv::circle(copy, minRect.center, 10, cv::Scalar(255), 1);
cv::imshow("src", src);
cv::imshow("copy", copy);
cv::waitKey();
结果:
矩形大小为:(30, 30, 9, 9)
腐蚀核大小:(9, 9)
最后只剩下矩形的中心点(34, 34),其余全部腐蚀掉了。如下所示:
[[1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1]] [[0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0] [0 0 0 0 1 0 0 0 0] [0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0]]
膨胀
cv::namedWindow("src", cv::WINDOW_NORMAL);
cv::namedWindow("copy", cv::WINDOW_NORMAL);
cv::Mat src(cv::Size(200, 200), CV_8UC1, cv::Scalar(0));
src.at(cv::Point(34, 34)) = 255;
//cv::rectangle(src, cv::Rect(30, 30, 9, 9), cv::Scalar(255), -1);
cv::Mat dilate;
cv::Mat kernel1 = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(9, 9));
morphologyEx(src, dilate, cv::MORPH_DILATE, kernel1);
std::vector> contours;
cv::findContours(dilate, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_NONE);
cv::RotatedRect minRect = cv::minAreaRect(contours[0]);
std::cout << "Rect: " << minRect.boundingRect() << std::endl;
std::cout << "after dilate size: " << minRect.boundingRect().tl() - cv::Point(30, 30) << std::endl;
cv::Mat copy(src.size(), src.type(), cv::Scalar(0));
cv::drawContours(copy, contours, -1, cv::Scalar(255), -1);
cv::imshow("src", src);
cv::imshow("copy", copy);
cv::waitKey();
结果
中心点坐标:(34, 34)
膨胀核大小:(9, 9)
最后输出矩形(30, 30, 9, 9),如下所示:
[[0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0] [0 0 0 0 1 0 0 0 0] [0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0] [0 0 0 0 0 0 0 0 0]] [[1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1] [1 1 1 1 1 1 1 1 1]]



