Как бы я манипулировал параметром обратного вызова trackbar, чтобы мой код компилировался с функцией, которая напечатана как Mat?
некоторая справочная информация: функция rangeIN () предназначена для получения входного Mat и возврата Mat. CreateTrackbar () в openCV доставляет мне некоторые проблемы, потому что я не уверен, как сопоставить параметры с функцией, которую я использую.
Вот на что я сейчас ссылаюсь:В OpenCV функция createTrackbar, что такое 6-й параметр (Данные пользователя), как он будет полезен (пожалуйста, найдите параметры в объяснении)
Mat rangeIN(const Mat& src_rangein) {
Mat dst_HSV;
int low_H = 0, low_S = 0, low_V = 0;
int high_H = 0, high_S = 0, high_V = 0;
cvtColor(src_rangein, dst_HSV, COLOR_BGR2HSV);
inRange(dst_HSV, Scalar(low_H, low_S, low_V), Scalar(high_H, high_S, high_V), dst_HSV);
namedWindow(window_capture_name);
namedWindow(window_detection_name);
// Trackbars to set thresholds for HSV values
createTrackbar("Low H", window_detection_name, &low_H, max_value_H, rangeIN); //"no instance of overloaded function "rangeIN" matches the required type
createTrackbar("High H", window_detection_name, &high_H, max_value_H, rangeIN); //same problem?
createTrackbar("Low S", window_detection_name, &low_S, max_value, rangeIN); //same problem?
createTrackbar("High S", window_detection_name, &high_S, max_value, rangeIN); //same problem?
createTrackbar("Low V", window_detection_name, &low_V, max_value, rangeIN); //same problem?
createTrackbar("High V", window_detection_name, &high_V, max_value, rangeIN); //same problem?
imshow(window_capture_name, src_rangein);
imshow(window_detection_name, dst_HSV);
return dst_HSV;
}
Я хочу сделать это, чтобы уменьшить использование глобальных переменных.
Текущие попытки решить проблему (работает, но все еще имеет глобальные значения int):
#include "opencv2/imgproc.hpp"#include "opencv2/highgui.hpp"#include <iostream>
using namespace cv;
const int max_value_H = 360 / 2;
const int max_value = 255;
const String window_capture_name = "Video Capture";
const String window_detection_name = "Object Detection";
int low_H = 0, low_S = 0, low_V = 0;
int high_H = max_value_H, high_S = max_value, high_V = max_value;
Mat rangeIN(const Mat & src_rangin) {
Mat dst_rangein;
cvtColor(src_rangin, dst_rangein, COLOR_BGR2HSV);
inRange(dst_rangein, Scalar(low_H, low_S, low_V), Scalar(high_H, high_S, high_V), dst_rangein);
namedWindow(window_capture_name);
namedWindow(window_detection_name);
imshow(window_capture_name, src_rangin);
imshow(window_detection_name, dst_rangein);
return dst_rangein;
}
void paraRangein(int, void*) {
createTrackbar("Low H", window_detection_name, &low_H, max_value_H, paraRangein);
createTrackbar("High H", window_detection_name, &high_H, max_value_H, paraRangein);
createTrackbar("Low S", window_detection_name, &low_S, max_value, paraRangein);
createTrackbar("High S", window_detection_name, &high_S, max_value, paraRangein);
createTrackbar("Low V", window_detection_name, &low_V, max_value, paraRangein);
createTrackbar("High V", window_detection_name, &high_V, max_value, paraRangein);
waitKey();
}
int main(int argc, char* argv[])
{
Mat src = imread("kid.jpg");
while (1) {
rangeIN(src);
paraRangein(0, 0);
}
waitKey();
return 0;
}
Изменить: в настоящее время, вероятно, худшая структурированная программа, которую я когда-либо писал. Если бы кто-нибудь мог выдвинуть идеи в комментариях, это могло бы помочь найти лучшее решение.
Благодарим @Tas, если это окажется правдоподобным ответом. «У вас может быть промежуточная функция, которая затем вызывает ваш Mat someFunction. Однако вы не можете вернуть значение в cv :: createTrackbar. Возможно, вам придется уточнить, что вы делаете. См. Также Как успешно передать функциональный объект (или лямбду) во второй аргумент обратного вызова трекбара (void *)?«
Задача ещё не решена.
Других решений пока нет …