gpt4 book ai didi

opencv - 替代 waitKey() 用于更新 OpenCV 中的窗口

转载 作者:太空宇宙 更新时间:2023-11-03 21:04:00 24 4
gpt4 key购买 nike

到目前为止我看过的所有示例和书籍都建议使用 waitKey(1) 强制重绘 OpenCV 窗口。这看起来很奇怪而且太老套了。为什么不必等待 1 毫秒?

还有其他选择吗?我试过 cv::updateWindow 但它似乎需要 OpenGL 并因此崩溃。我在 Windows 上使用 VC++。

最佳答案

我查看了源代码,正如@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;
}

关于opencv - 替代 waitKey() 用于更新 OpenCV 中的窗口,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36345615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com