做网站平方根怎么表示,中电云主机怎样登入创建的网站,关于做网站的书,提升wordpress访问速度1. 项目背景
本项目旨在开发一个图像处理程序#xff0c;通过使用计算机视觉技术#xff0c;能够自动检测图像中物体的尺寸并进行分类。项目利用了开源的计算机视觉库 OpenCV#xff0c;实现了图像的灰度处理、二值化、轮廓检测、边界框绘制以及尺寸分类等功能。通过这些功…
1. 项目背景
本项目旨在开发一个图像处理程序通过使用计算机视觉技术能够自动检测图像中物体的尺寸并进行分类。项目利用了开源的计算机视觉库 OpenCV实现了图像的灰度处理、二值化、轮廓检测、边界框绘制以及尺寸分类等功能。通过这些功能可以为用户提供一个便捷的工具用于快速了解图像中物体的大小信息。
2. 技术与工具
编程语言 C主要库 OpenCV版本1460开发环境 Visual Studio版本 2022Windows 10版本控制 Git
3. 主要功能
本项目的主要功能包括
图像读取与预处理 从文件系统中读取图像并将其转换为灰度图像进行后续处理。二值化处理 应用阈值将灰度图像转换为二值图像以便进行轮廓检测。轮廓检测与筛选 使用 OpenCV 提供的轮廓检测函数 findContours并筛选出最大面积的轮廓。边界框绘制 对检测到的最大面积轮廓绘制边界框并计算其尺寸。尺寸分类 根据边界框的尺寸宽度和高度将物体分为大、中、小三类并输出分类结果。结果显示与保存 将处理后的图像显示在窗口中并可以选择保存处理结果。
4. 使用方法
用户可以通过以下步骤使用该项目
准备图像 将需要处理的图像放置在指定的目录中例如 ../image/。运行程序 在开发环境中编译并运行项目或者直接运行已编译好的可执行文件。查看结果 程序将依次处理每张图像检测物体的尺寸并输出分类结果。 #include opencv2/opencv.hpp
#include iostream
#include vectorusing namespace std;
using namespace cv;// 函数声明处理单张图像并输出最大边界框尺寸类别
void processImage(const string imagePath);// 函数定义处理单张图像并输出最大边界框尺寸类别
void processImage(const string imagePath) {// 读取图像Mat image imread(imagePath);// 检查图像是否成功读取if (image.empty()) {cout 无法打开或找到图像: imagePath endl;return; // 返回主函数继续处理下一张图像}// 将图像转换为灰度格式Mat img_gray;cvtColor(image, img_gray, COLOR_BGR2GRAY);// 应用二值化阈值处理int lower_gray_threshold 35; // 设置较低的灰度阈值 0int upper_gray_threshold 90; // 设置较高的灰度阈值 255Mat thresh;threshold(img_gray, thresh, lower_gray_threshold, upper_gray_threshold, THRESH_BINARY);// 在二值化图像上检测轮廓使用 RETR_TREE 检索模式vectorvectorPoint contours;vectorVec4i hierarchy;findContours(thresh, contours, hierarchy, RETR_TREE, CHAIN_APPROX_NONE);// 找到最大面积的轮廓double max_area 0;int max_area_index -1;for (size_t i 0; i contours.size(); i) {double area contourArea(contours[i]);if (area max_area) {max_area area;max_area_index static_castint(i);}}// 如果找到最大面积的轮廓则绘制其边界框并输出尺寸类别if (max_area_index ! -1) {Mat image_copy image.clone();// 绘制最大面积轮廓drawContours(image_copy, contours, max_area_index, Scalar(0, 255, 0), 2);// 获取最大面积轮廓的边界框Rect bounding_rect boundingRect(contours[max_area_index]);// 绘制边界框rectangle(image_copy, bounding_rect, Scalar(0, 0, 255), 2);// 获取边界框的中心点Point center(bounding_rect.x bounding_rect.width / 2, bounding_rect.y bounding_rect.height / 2);// 标注宽度和高度string text Width: to_string(bounding_rect.width) , Height: to_string(bounding_rect.height);int fontFace FONT_HERSHEY_SIMPLEX;double fontScale 0.5;int thickness 1;int baseline 0;Size textSize getTextSize(text, fontFace, fontScale, thickness, baseline);Point textOrg(center.x - textSize.width / 2, center.y textSize.height / 2);putText(image_copy, text, textOrg, fontFace, fontScale, Scalar(255, 0, 0), thickness);// 输出边界框的尺寸int bounding_width bounding_rect.width;int bounding_height bounding_rect.height;string size_category;if (bounding_width 2000 bounding_height 2000) {size_category 大;}else if (bounding_width 1000 bounding_height 1000) {size_category 中;}else {size_category 小;}cout 图像: imagePath 尺寸 bounding_width x bounding_height 尺寸类别 size_category endl;// 显示和保存结果可选// imshow(最大边界框, image_copy);// string output_filename largest_bounding_box_ to_string(i) .jpg;// imwrite(output_filename, image_copy);// waitKey(0);// destroyAllWindows();}else {cout 在图像 imagePath 中未找到符合条件的轮廓。 endl;}
}int main() {// 图像路径列表vectorstring imagePaths {D:/Project/image/001.jpg,D:/Project/image/002.jpg,D:/Project/image/003.jpg,D:/Project/image/004.jpg,D:/Project/image/005.jpg,D:/Project/image/006.jpg,D:/Project/image/007.jpg,};// 遍历处理每张图像for (const auto imagePath : imagePaths) {processImage(imagePath);}return 0;
}