我开始阅读学习OpenCV 3 ,但由于我没有用c ++编程,我对以下代码片段中使用回调函数的方式感到困惑:
int g_slider_position = 0;
int g_run = 1, g_dontset = 0;
cv::VideoCapture g_cap;
void onTrackBarSlide(int pos, void *)
{
g_cap.set(CV_CAP_PROP_POS_FRAMES, pos);
if (!g_dontset) g_run = 1;
g_dontset = 0;
}
int main(int argc, char** argv)
{
g_cap.open(std::string(argv[1]));
int frames = (int)g_cap.get(CV_CAP_PROP_FRAME_COUNT);
cv::createTrackbar(
"Position",
"Example 2-4",
&g_slider_position,
frames,
onTrackBarSlide
);
cv::Mat frame;
for (;;)
{
if (g_run != 0)
{
g_cap >> frame;
if (frame.empty())
{
break;
}
int current_pos = (int)g_cap.get(CV_CAP_PROP_POS_FRAMES);
g_dontset = 1;
cv::setTrackbarPos("Position", "Example 2-4", current_pos);
cv::imshow("Example 2-4", frame);
g_run -= 1;
}
char c = (char)cv::waitKey(10);
if (c == 's')
{
g_run = 1;
}
if (c == 'r')
{
g_run = -1;
}
}
return 0;
}
我从中收集到的是按下 Trackbar 上的某个位置会引发一个调用onTrackBarSlide
的事件。
我想知道int pos
论点来自何处?我无法在功能文档中找到它。
当我单步执行此程序时,onTrackBarSlide
之后会调用setTrackbarPos
。这让我感到困惑,并让我认为setTrackbarPos
只是以current_pos
作为onTrackBarSlide
侦听的参数来举起一个事件。
但是为什么不能通过setTrackbarPos
直接调用g_cap.set
来更直接地完成这项工作?