繁体   English   中英

OpenCV 范围 slider 的 HSV 过滤器不工作

[英]OpenCV HSV filter with range slider not working

我目前正在研究一个视觉系统来检测 a.jpg 中的蓝莓

我想尝试制作显示三个 windows 的代码,一个带有我的普通图像(未过滤)图像,一个带有一组控制 HSV 上限和下限的滑块,一个显示我的过滤图像。

目前这是我的代码:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;
using namespace std;

Mat image;
Mat imgHSV;
Mat OutputImage;

int iLowH;
int iHighH;
int iLowS;
int iHighS;
int iLowV;
int iHighV;

static void HSVthreshold(int, int, int, int, int, int, void*)
{
   inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), OutputImage);
}

int main(int argc, char** argv)
{
    //Read image
    image = imread("C:\\OpenCV-test-imgs\\blueberryTest2.jpg", 1);
    if (image.empty())
    {
        cerr << "image was not read !" << endl;
        return 1;
    }

    //convert RGB to HSV
    cvtColor(image, imgHSV, COLOR_BGR2HSV);

    //Create windows
    namedWindow("image", WINDOW_FREERATIO); //window for original image
    namedWindow("Control", WINDOW_AUTOSIZE); //window for HSV-control sliders
    namedWindow("Output", WINDOW_AUTOSIZE); //window for output mask

    //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);

    int key = 0;
    while (key != 27) { // 27 is escape
        HSVthreshold(iLowH, iHighH, iLowS, iHighS, iLowV, iHighV, 0);
        imshow("Output", OutputImage);
        imshow("image", imgHSV);
        key = waitKey(1); // wait at most 1 ms for input, if nothing was pressed result is -1
    }
    return 0;
}

我有我正在寻找的三个 windows,但滑块似乎没有任何作用。 有谁知道解决这个问题的方法。

抱歉,如果我不了解 OpenCV 中的简单内容,我对此很陌生。

编辑:我稍微编辑了代码以消除一些错误。

Edit2:更新的代码,包括错误消息

Edit3:更新的代码,现在正在运行,删除了错误消息

cv::waitKey为 opencv 提供了一个“时刻”来处理您想要显示的内容。 您只调用了两次,因此 opencv 仅重新计算图像两次。

在您的代码中,程序在创建“控制”window 之前挂起,但您应该看到“图像”window。 您按下任何按钮,程序将继续。 return之前它又挂了一次。 然后你应该也会看到“控制”window,但在此期间基本上什么都没有发生。

添加一个循环以启用处理并从代码的 rest 中删除对cv::waitKey的相互调用。 这种方式程序将每毫秒重新计算 windows。

// rest of your code

int key = 0;
while(key != 27) { // 27 is escape
    // wait at most 1 ms for input, if nothing was pressed result is -1
    key = cv::waitKey(1);
}
return 0;

请查看cv::waitKey 文档以获取更多信息。


我没有注意到您的跟踪栏是在没有回调参数的情况下创建的 - 请参阅createTrackbar 文档 您也可能对trackbar example感兴趣。 话虽如此,您可以采取两种方法:

  1. while循环中调用您的HSVthreshold function
  2. 创建回调 function 并在调用createTrackbar时将其分配为回调

由于我看到无论如何都不需要HSVthreshold参数,因此您可以更改此 function 签名以匹配createTrackbar所需的签名并将其分配为回调 - 所以第二种方法。 代码应如下所示:

#include <iostream>
#include <opencv2/opencv.hpp>
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>

using namespace cv;
using namespace std;

Mat OutputImage;
Mat image;

int iLowH;
int iHighH;
int iLowS;
int iHighS;
int iLowV;
int iHighV;

double alpha;
double beta;

// From the docs: 
// "Callback function should be prototyped as void Foo(int,void*);
// first parameter is the trackbar position and the second parameter is the user data"
// Both of these are not relevant to you at this point 
static void HSVthreshold(int, void*)
{
    inRange(image, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), OutputImage);
}

int main(int argc, char** argv)
{
    image = imread("C:\\OpenCV-test-imgs\\blueberryTest1.jpg", 1);

    // Create all windows
    namedWindow("image", WINDOW_FREERATIO);
    namedWindow("Control", WINDOW_AUTOSIZE); 
    namedWindow("Output", WINDOW_AUTOSIZE);

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

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

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

    int key = 0;
    while (key != 27) { 
        // Refresh images
        imshow("Output", OutputImage);
        imshow("image", image);
        key = waitKey(1);         
    }
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM