首页 文章

OpenCV:在非常嘈杂的视频上检测LED颜色

提问于
浏览
1

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

有任何想法吗 ?

1 回答

  • 4

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

    因此,您应首先检测饱和像素斑点(可能转换为灰度,然后阈值具有相当高的阈值) . 然后,如果您还需要了解LED的颜色,则应分析找到的斑点周围的halo .

相关问题