# 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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。