openCV C ++ & quot; createTrackbar & quot ;, параметр функции обратного вызова. Имеет ли значение тип функции обратного вызова?

Как бы я манипулировал параметром обратного вызова 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 *)?«

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]