您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# C++怎么用OpenCV获取图片中物品的数量
在计算机视觉领域,使用OpenCV库进行图像处理是常见的解决方案。本文将详细介绍如何通过C++和OpenCV实现图片中物品数量的统计,涵盖从图像预处理到轮廓检测的完整流程。
---
## 一、环境准备
### 1. 安装OpenCV
```bash
# Ubuntu安装命令
sudo apt-get install libopencv-dev
# Windows可通过vcpkg或官网预编译包安装
vcpkg install opencv
配置CMakeLists.txt:
cmake_minimum_required(VERSION 3.10)
project(ItemCounter)
find_package(OpenCV REQUIRED)
add_executable(main main.cpp)
target_link_libraries(main ${OpenCV_LIBS})
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat image = imread("objects.jpg");
if(image.empty()) {
std::cerr << "图像加载失败!" << std::endl;
return -1;
}
}
关键步骤:
// 转换为灰度图
Mat gray;
cvtColor(image, gray, COLOR_BGR2GRAY);
// 高斯模糊降噪
GaussianBlur(gray, gray, Size(5,5), 0);
// 二值化处理
Mat binary;
threshold(gray, binary, 100, 255, THRESH_BINARY_INV);
vector<vector<Point>> contours;
vector<Vec4i> hierarchy;
findContours(binary, contours, hierarchy, RETR_EXTERNAL, CHN_APPROX_SIMPLE);
// 过滤小面积噪声
int validCount = 0;
for(const auto& contour : contours) {
if(contourArea(contour) > 500) { // 面积阈值
validCount++;
drawContours(image, vector<vector<Point>>{contour}, -1, Scalar(0,255,0), 2);
}
}
std::cout << "检测到物品数量: " << validCount << std::endl;
Mat labels, stats, centroids;
int numObjects = connectedComponentsWithStats(binary, labels, stats, centroids);
// 减去背景
numObjects--;
// 可视化
for(int i=1; i<numObjects; i++) {
if(stats.at<int>(i, CC_STAT_AREA) > 500) {
rectangle(image,
Point(stats.at<int>(i, CC_STAT_LEFT), stats.at<int>(i, CC_STAT_TOP)),
Point(stats.at<int>(i, CC_STAT_LEFT) + stats.at<int>(i, CC_STAT_WIDTH),
stats.at<int>(i, CC_STAT_TOP) + stats.at<int>(i, CC_STAT_HEIGHT)),
Scalar(0,0,255), 2);
}
}
// 闭运算填充空洞
Mat kernel = getStructuringElement(MORPH_RECT, Size(7,7));
morphologyEx(binary, binary, MORPH_CLOSE, kernel);
adaptiveThreshold(gray, binary, 255,
ADAPTIVE_THRESH_GAUSSIAN_C, THRESH_BINARY_INV, 11, 2);
Mat hsv;
cvtColor(image, hsv, COLOR_BGR2HSV);
inRange(hsv, Scalar(0,50,50), Scalar(10,255,255), binary); // 红色物体
#include <opencv2/opencv.hpp>
#include <iostream>
int main() {
// 1. 读取图像
Mat src = imread("objects.jpg");
// 2. 预处理
Mat gray, binary;
cvtColor(src, gray, COLOR_BGR2GRAY);
GaussianBlur(gray, gray, Size(5,5), 0);
threshold(gray, binary, 100, 255, THRESH_BINARY_INV);
// 3. 形态学处理
Mat kernel = getStructuringElement(MORPH_RECT, Size(7,7));
morphologyEx(binary, binary, MORPH_CLOSE, kernel);
// 4. 轮廓检测
vector<vector<Point>> contours;
findContours(binary, contours, RETR_EXTERNAL, CHN_APPROX_SIMPLE);
// 5. 结果输出
int count = 0;
for(const auto& contour : contours) {
if(contourArea(contour) > 500) {
count++;
drawContours(src, vector<vector<Point>>{contour}, -1, Scalar(0,255,0), 2);
}
}
std::cout << "Total objects: " << count << std::endl;
imshow("Result", src);
waitKey(0);
return 0;
}
误检问题:
漏检问题:
Canny(gray, binary, 50, 150);
重叠物体:
watershed(image, markers);
通过上述方法,您可以准确统计图像中的物品数量。实际应用中需要根据具体场景调整参数,建议使用trackbar
进行交互式调试:
namedWindow("Control");
createTrackbar("Threshold", "Control", &threshVal, 255, callbackFunc);
希望本教程能帮助您快速实现物品计数功能! “`
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。