@Dan Masekが言ったように、Windowsメッセージを処理する他の機能はないようです。だから私はVC++のために私自身の小さなDoEvents()関数を書くことになった。以下は、必要な数のフレームをスキップしながら、OpenCVを使用してフレームごとにビデオを表示する完全なソースコードです。
#include <windows.h>
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
bool DoEvents();
int main(int argc, char *argv[])
{
VideoCapture cap(argv[1]);
if (!cap.isOpened())
return -1;
namedWindow("tree", CV_GUI_EXPANDED | CV_WINDOW_AUTOSIZE);
double frnb(cap.get(CV_CAP_PROP_FRAME_COUNT));
std::cout << "frame count = " << frnb << endl;
for (double fIdx = 0; fIdx < frnb; fIdx += 50) {
Mat frame;
cap.set(CV_CAP_PROP_POS_FRAMES, fIdx);
bool success = cap.read(frame);
if (!success) {
cout << "Cannot read frame " << endl;
break;
}
imshow("tree", frame);
if (!DoEvents())
return 0;
}
return 0;
}
bool DoEvents()
{
MSG msg;
BOOL result;
while (::PeekMessage(&msg, NULL, 0, 0, PM_NOREMOVE))
{
result = ::GetMessage(&msg, NULL, 0, 0);
if (result == 0) // WM_QUIT
{
::PostQuitMessage(msg.wParam);
return false;
}
else if (result == -1)
return true; //error occured
else
{
::TranslateMessage(&msg);
::DispatchMessage(&msg);
}
}
return true;
}
ドキュメントによると、それはイベント処理を行う唯一の方法です。コード( 'modules \ highgui \ src \ window_w32.cpp')を見ると、それはかなり簡単なメッセージポンプです。あなた自身の修正バージョンを簡単に書くことができます - キー押下チェックやスリープなどをドロップします。 –