Derzeit verwendet mein Programm C ++ OpenCV 4.10.0, um Videodateien zu laden. Wenn ich jedoch einen Bildrahmen lade und sofort Operationen mit anderen Algorithmen ausführt, sinkt die Bildrate zu stark. Infolgedessen habe ich beschlossen, asynchrone Operationen mit einer Weile -Schleife zu verwenden, um die Bilder zu laden, und dann in einem Deque als Puffer speichern. Eine andere Funktion knallt Frames aus diesem Deque. Ich frage mich, ob die Rahmen, die in der asynchronen Funktion durch die while -Schleife abgerufen wurden, garantiert ihre Bestellung beibehalten.std::mutex v_mutex;
void Video::RunVideo()
{
async_cam = std::async(std::launch::async,[&]{
while(video_flag)
{
cv::Mat frame;
cam.read(frame);
if(frame.empty()) {continue;}
const std::scoped_lock lck(v_mutex);
cv::Mat frame_clone = frame.clone();
frames.push_back(frame);
if(frames.size() > 6 && !start_flag) {start_flag = !start_flag;}
}
});
}
cv::Mat Video::GetFrame()
{
cv::Mat cur_frame;
if(start_flag && frames.size() > 0)
{
const std::scoped_lock lck(v_mutex);
cur_frame = frames.at(0).clone();
frames.pop_front();
}
return cur_frame;
}
< /code>
Der obige Code zeigt einen Teil meines Codes an. Wenn die Runvideo -Funktion aufgerufen wird, verwendet sie eine asynchrone Lambda -Funktion mit einer Weile Schleife, um Videorahmen zu laden. Und ich möchte auch herausfinden, ob die Frames in der richtigen Reihenfolge in der richtigen Reihenfolge bleiben (anstelle von Async) auf die gleiche Weise. Vielen Dank im Voraus für Ihre Antwort.
In Bezug auf die Garantie der Ausführungsreihenfolge bei der Durchführung von C ++ OpenCV -Bild -Lesevorgängen innerhalb ⇐ C++
-
- Similar Topics
- Replies
- Views
- Last post