Opencv:将使用视频的代码更改为使用轨迹栏进行颜色检测的图像

Posted

技术标签:

【中文标题】Opencv:将使用视频的代码更改为使用轨迹栏进行颜色检测的图像【英文标题】:Opencv: Changing a code that uses video to an image for color detection using trackbars 【发布时间】:2016-04-13 15:26:03 【问题描述】:

我有一个项目,我需要从树叶图像中检测特定颜色,例如绿色、棕色和黄色。 我找到了本教程 (http://opencv-srf.blogspot.com.br/2010/09/object-detection-using-color-seperation.html),它解释了如何创建实时轨迹栏以找到最佳值,但它使用来自网络摄像头的图像,我想将它与图片一起使用。 你们能帮我做吗?

谢谢。

【问题讨论】:

请注意,这是一个问答网站,而不是代码编写服务。如果您edit您的问题描述了您到目前为止所尝试的内容以及您遇到的问题,那么我们可以尝试帮助解决具体问题。您还应该阅读How to Ask。 真的很抱歉。我在另一个用户提出的另一个问题(***.com/questions/36586924/…)中问了这个问题,并且在我工作的时候很匆忙,因为我想在上课之前稍后再学习它,我忘了给你看我的代码写了这行不通。我会接受你的建议,我不会这么急着问问题,所以我不会忘记向你展示更多细节。谢谢。 【参考方案1】:

这是对 HSV 图像进行阈值处理的代码,使用轨迹栏选择范围。

请注意,与视频不同(如 here 所述),我使用 morphologyEx 执行形态学运算,并将 C 风格的 cvCreateTrackbar 替换为 C++ 函数 createTrackbar

代码中的cmets应该是清楚的。如果有不清楚的地方请联系我:

#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;

int main(int argc, char** argv)

    // Load BGR image
    Mat3b bgr = imread("path_to_image");
    if (bgr.empty()) 
    
        cout << "Cannot open the image" << endl;
        return -1;
    

    // Transform to HSV
    Mat3b hsv;
    cvtColor(bgr, hsv, COLOR_BGR2HSV); 

    // Create a window called "Control"
    namedWindow("Control", CV_WINDOW_AUTOSIZE); 

    // Set starting values for ranges
    int iLowH = 0;
    int iHighH = 179;

    int iLowS = 0;
    int iHighS = 255;

    int iLowV = 0;
    int iHighV = 255;

    //Create trackbars in "Control" window
    createTrackbar("LowH", "Control", &iLowH, 179); //Hue (0 - 179)
    createTrackbar("HighH", "Control", &iHighH, 179);

    createTrackbar("LowS", "Control", &iLowS, 255); //Saturation (0 - 255)
    createTrackbar("HighS", "Control", &iHighS, 255);

    createTrackbar("LowV", "Control", &iLowV, 255); //Value (0 - 255)
    createTrackbar("HighV", "Control", &iHighV, 255);

    //Show the original image
    imshow("Original", bgr); 

    // Create kernel for morphological operation
    Mat kernel = getStructuringElement(MORPH_ELLIPSE, Size(5, 5));

    // Infinte loop, until user press "esc"
    while (true)
    
        Mat mask;
        inRange(hsv, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), mask); //Threshold the image

        //morphological opening (remove small objects from the foreground)
        morphologyEx(mask, mask, MORPH_OPEN, kernel);

        //morphological closing (fill small holes in the foreground)
        morphologyEx(mask, mask, MORPH_CLOSE, kernel);

        //Show the thresholded image
        imshow("Thresholded Image", mask); 

        if (waitKey(30) == 27) //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop
        
            cout << "esc key is pressed by user" << endl;
            break;
        
    
    return 0;

【讨论】:

三木,非常感谢!这正是我所需要的。

以上是关于Opencv:将使用视频的代码更改为使用轨迹栏进行颜色检测的图像的主要内容,如果未能解决你的问题,请参考以下文章

opencv学习——轨迹栏作为调色板

OpenCV中的GUI特性 —— 绘图+鼠标画笔+轨迹栏调色板

使用 opencv 和 Qt 录制视频

OpenCV竟然可以这样学!成神之路终将不远

如何使用带有c ++的opencv库将下图中的黑色像素更改为红色像素

如何使用opencv python将黑色更改为红色