Note:简单提取,不考虑后处理(填充空洞、平滑边界等)
#include <iostream>
#include "opencv2/imgproc.hpp"
#include "opencv2/highgui.hpp"
#include <opencv2/opencv.hpp>
using namespace cv;
#pragma comment(lib,"opencv_world490d.lib")
int main(int, char**)
{
// 读取图像
cv::Mat originalImage = cv::imread("D:\\OpenCV\\1.jpg");
cv::Mat image = cv::imread("D:\\OpenCV\\1.jpg", cv::IMREAD_GRAYSCALE);
// 应用阈值处理
cv::Mat binaryImage;
cv::threshold(image, binaryImage, 128, 255, cv::THRESH_BINARY);
// 可以使用滤波、边缘检测等方法进行图像处理和增强
// 可以使用特征提取、目标检测等方法进行建筑物识别
//创建结构元素
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(10, 10));
//膨胀
cv::Mat dilateImage;
cv::dilate(binaryImage, dilateImage, kernel, cv::Point(0, 0), 3);
//腐蚀
cv::Mat erodedImage;
cv::erode(dilateImage, erodedImage, kernel);
// 颜色反转
cv::bitwise_not(erodedImage, erodedImage);
// 寻找轮廓
std::vector<std::vector<cv::Point>> contours;
cv::findContours(erodedImage, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE);
// 绘制轮廓
cv::Mat contourImage = cv::Mat::zeros(image.size(), CV_8UC3);
cv::drawContours(contourImage, contours, -1, cv::Scalar(0, 255, 0),2);
//将轮廓叠加到原始图片上
Mat resultImage;
addWeighted(originalImage, 0.7, contourImage, 0.3, 0, resultImage);
// 创建窗口并显示图片
cv::imshow("Original Image", originalImage);
//cv::imshow("Tree", contourImage);
cv::imshow("Tree", resultImage);
// 等待按键退出
cv::waitKey(0);
// 销毁窗口
cv::destroyAllWindows();
}
处理效果: