>
std::async()
CamHandler
的类来封装它。这个示例是故意异步的,我知道我可以在获取图像后显示它:)
cap
:open()
函数
auto camHandler::initCamera(int deviceID) -> camHandler::CamState {
this->deviceID = deviceID;
this->apiID = cv::CAP_ANY;
cap.open(deviceID, apiID);
if (!cap.isOpened()) {
this->currentState = error;
return this->currentState;
}
return Ready;
}
auto camHandler::imageStreaming() -> void{
this->currentState = streaming;
while(true)
{
std::cout << "Acc " << std::endl;
cap.read(this->frame);
this->acquired++;
if (this->frame.empty()) {
this->currentState = error;
break;
}
};
}
和
auto camHandler::displayImage() -> void {
while(true){
std::cout << "Disp " << std::endl;
cv::imshow("Live", this->frame);
this->displayed++;
if (cv::waitKey(5) >= 0){
this->currentState = paused;
break;
}
};
}
auto camHandler::startStreaming() -> void {
auto stream = std::async(&camHandler::imageStreaming, this);
auto disp = std::async(&camHandler::displayImage, this);
}
这个问题
在我的main
中,我只调用:
camHandler ch;
ch.initCamera();
ch.startStreaming();
我得到:
Acc Disp
Acc
Acc
Acc
Acc
Acc
这意味着display只被调用一次,而acquisition一直在运行。
如果尝试使用空的cv::mat
调用cv::imshow
,它将产生异常,并且async
将结束。
因为它是在异步中运行的,所以可以在cap.read(this->frame)
之前调用cv::imshow(“live”,this->frame)
。