gpt4 book ai didi

c++ - OpenCV:在非常嘈杂的视频中检测 LED 颜色

转载 作者:太空宇宙 更新时间:2023-11-03 22:05:04 25 4
gpt4 key购买 nike

我是 OpenCV 的新手。

我需要通过获取轮廓来检测和跟踪图像中的彩色 LED。我将图像转换为 HSV 以实现此目的。

唯一的问题是我那愚蠢的相机只有 176x144 像素的分辨率,而且有很多噪点。

这是我得到的输出:

http://imagizer.imageshack.us/v2/766x431q90/r/661/HQSD1L.jpg input images

我正在使用的代码:

int main () {

// Create HSV track-bar
cv::namedWindow("track-bar");
cv::createTrackbar("H max", "track-bar", &maxH, 255);
cv::createTrackbar("H min", "track-bar", &minH, 255);
cv::createTrackbar("S max", "track-bar", &maxS, 255);
cv::createTrackbar("S min", "track-bar", &minS, 255);
cv::createTrackbar("V max", "track-bar", &maxV, 255);
cv::createTrackbar("V min", "track-bar", &minV, 255);
cv::resizeWindow("track-bar", 0, 0);

cv::Mat img;
cv::VideoCapture cap(0);

while (true)
{
// Get capture
cap >> img;

// Declaration of hsv image
cv::Mat hsv;
cv::cvtColor(img, hsv, cv::COLOR_BGR2HSV_FULL);

// Binalize
cv::Mat binalized;
cv::Scalar lower(minH, minS, minV);
cv::Scalar upper(maxH, maxS, maxV);
cv::inRange(hsv, lower, upper, binalized);

// Show result
cv::imshow("binalized", binalized);

// Detect contours
std::vector<std::vector<cv::Point>> contours;
std::vector<cv::Vec4i> hierarchy;

// Find largest contour
int contour_index = -1;
double max_area = 0.0;
for (size_t i = 0; i < contours.size(); i++) {
double area = fabs(cv::contourArea(contours[i]));
if (area > max_area) {
contour_index = i;
max_area = area;
}
}
// Object detected
if (contour_index >= 0) {
// Moments
cv::Moments moments = cv::moments(contours[contour_index], true);
double marker_y = (int)(moments.m01 / moments.m00);
double marker_x = (int)(moments.m10 / moments.m00);

// Show X by Y location
cout << "X:" << marker_x << " Y:" << marker_y << endl;

// Show result
cv::Rect rect = cv::boundingRect(contours[contour_index]);
cv::rectangle(img, rect, cv::Scalar(0, 255, 0));
}


// Show output
cv::imshow("image", img);
cv::waitKey(33);
}

我尝试了 cv::fastNlMeansDenoisingColoredMulti() 但没有成功。

有什么想法吗?

最佳答案

看到您的输入图像,问题是由于饱和度,颜色信息在 LED 中心完全丢失:那里有白色像素。

因此,您应该首先检测饱和像素 Blob (可能转换为灰度,然后使用相当高的阈值进行阈值检测)。那么如果您还需要知道 LED 的颜色,您应该分析 halo在找到的 blob 周围。

关于c++ - OpenCV:在非常嘈杂的视频中检测 LED 颜色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30062887/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com