【问题标题】:OpenCV: Detecting LED color on a very noisy videoOpenCV:在非常嘈杂的视频上检测 LED 颜色
【发布时间】:2015-07-15 18:32:12
【问题描述】:

我是 OpenCV 的新手。

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

唯一的问题是我笨拙的相机分辨率为 176x144 像素,而且噪点很多。

这是我得到的输出:

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

我正在使用的代码:

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() 没有任何成功。

有什么想法吗?

【问题讨论】:

  • 能否在颜色转换前显示输入图像(img)?
  • 第二。您的代码基本上没有任何问题,但输入图像可能包含一些关于什么是更好的处理路径的线索。
  • 您的图像是否集中?这是单个LED还是LED阵列还是LED显示屏?很难从那个模糊中说出来
  • 好的,这些是未经任何转换的原始输出图像:link
  • 对不起,我的意思是输入图像*

标签: c++ opencv image-processing object-detection


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-08
    • 2018-01-09
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2023-03-13
    相关资源
    最近更新 更多