03-21-2024, 02:39 PM
要使用OpenCV检测摄像头中的白色斑点,你可以采用以下步骤:
一、使用OpenCV的VideoCapture类获取摄像头流。
二、使用cv::cvtColor将捕获的图像从BGR颜色空间转换为灰度空间。
三、应用阈值操作来突出显示白色斑点。
四、使用形态学操作(如开运算或闭运算)来去除噪声和平滑图像。
五、使用cv::findContours找到白色斑点的轮廓。
六、使用cv::drawContours在原图上绘制轮廓以标识斑点位置。
以下是一个简单的C++代码示例:
#include <opencv2/opencv.hpp>
#include <vector>
int main() {
cv::VideoCapture cap(0); // 打开默认摄像头
if (!cap.isOpened()) {
return -1;
}
cv::Mat frame;
while (true) {
cap >> frame; // 从摄像头读取新的帧
if (frame.empty()) {
break;
}
cv::Mat gray, thresholded;
cv::cvtColor(frame, gray, cv::COLOR_BGR2GRAY); // 转换到灰度空间
cv::threshold(gray, thresholded, 100, 255, cv::THRESH_BINARY); // 阈值处理,阈值根据实际情况调整
// 形态学操作去除噪声
cv::Mat kernel = cv::getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
cv::morphologyEx(thresholded, thresholded, cv::MORPH_OPEN, kernel);
std::vector<std::vector<cv:oint>> contours;
cv::findContours(thresholded, contours, cv::RETR_EXTERNAL, cv::CHAIN_APPROX_SIMPLE); // 寻找轮廓
// 绘制轮廓
cv::Mat result;
frame.copyTo(result);
cv::drawContours(result, contours, -1, cv::Scalar(0, 255, 0), 2);
//每个识别轮廓绘制外接圆
// 为每个轮廓找到最小外接圆
for (const auto& contour : contours) {
float radius;
cv:oint2f center;
cv::minEnclosingCircle(contour, center, radius);
// 绘制外接圆
cv::circle( result , center, static_cast<int>(radius), cv::Scalar(255, 0, 0), 2);
}
//窗口显示识别结果
cv::imshow("Spots Detection", result);
if (cv::waitKey(100) == 27) {
break;
}
}
return 0;
}
悟空学堂 专注交互技术分享