给定以下程序代码:
void on_low_height_thresh_trackbar(int, void*);
void on_high_height_thresh_trackbar(int, void*);
int low_height = 50, high_height = 85;
int main()
{
img_Original = cv::imread("ROI1.jpg", 0);
cv::medianBlur(img_Original, img_Median, 5);
cv::namedWindow("original image");
cv::namedWindow("selected image");
cv::createTrackbar("Low height", "selected image", &low_height, 255, on_low_height_thresh_trackbar);
cv::createTrackbar("High height", "selected image", &high_height, 255, on_high_height_thresh_trackbar);
cv::imshow("original image", img_Original);
on_low_height_thresh_trackbar(low_height, 0);
on_high_height_thresh_trackbar(high_height, 0);
cv::waitKey(0);
return 0;
}
void on_low_height_thresh_trackbar(int, void*)
{
low_height = cv::min(high_height - 1, low_height);
cv::setTrackbarPos("Low height", "selected image", low_height);
cv::inRange(img_Median, low_height, high_height, img_Ranged);
cv::imshow("selected image", img_Ranged);
}
void on_high_height_thresh_trackbar(int, void*)
{
high_height = cv::max(high_height, low_height + 1);
cv::setTrackbarPos("High height", "selected image", high_height);
cv::inRange(img_Median, low_height, high_height, img_Ranged);
cv::imshow("selected image", img_Ranged);
}为什么在这个回调函数中需要这两个形式参数int和void*:
void on_low_height_thresh_trackbar(int, void*)我觉得它们没有用。
发布于 2019-12-11 15:31:21
因为这些都是回调,所以当trackbar位置发生变化时,OpenCV会调用它们,而不应该自己调用它们。
int参数是新的trackbar位置,void*是指向任意“用户数据”的指针。
如果将指针作为userdata参数传递给createTrackbar,则该指针在被调用时将被传递回回调。
在C++中,将指向对象的指针作为“用户数据”传递是非常常见的。
例如,您可以编写一个封装trackbar并将this作为“用户数据”传递的this类。
大多数回调接口提供了一种让您自己的数据以这种方式进行“往返”的方法。
https://stackoverflow.com/questions/59288441
复制相似问题