[英]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感兴趣。 话虽如此,您可以采取两种方法:
while
循环中调用您的HSVthreshold
functioncreateTrackbar
时将其分配为回调由于我看到无论如何都不需要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.