dee*_*ore 6 c++ multithreading opencv rtsp
因此,我目前正在开展一个需要在 rtsp ip cam 上进行面部识别的项目,我设法毫无问题地获得了 rtsp 提要,但是在应用面部识别时,视频提要变得太慢并显示很大的延迟,我什至使用多线程来使它更好,但没有成功,这是我的代码,我仍然是多线程问题的初学者,所以任何帮助将不胜感激。
#include <iostream>
#include <thread>
#include "opencv2/opencv.hpp"
#include <vector>
using namespace std;
using namespace cv;
void detect(Mat img, String strCamera) {
string cascadeName1 = "C:\\ocv3.2\\Build\\install\\etc\\haarcascades\\haarcascade_frontalface_alt.xml";
CascadeClassifier facedetect;
bool loaded1 = facedetect.load(cascadeName1);
Mat original;
img.copyTo(original);
vector<Rect> human;
cvtColor(img, img, CV_BGR2GRAY);
equalizeHist(img, img);
facedetect.detectMultiScale(img, human, 1.1, 2, 0 | 1, Size(40, 80), Size(400, 480));
if (human.size() > 0)
{
for (int gg = 0; gg < human.size(); gg++)
{
rectangle(original, human[gg].tl(), human[gg].br(), Scalar(0, 0, 255), 2, 8, 0);
}
}
imshow("Detect " + strCamera, original);
int key6 = waitKey(40);
//End of the detect
}
void stream(String strCamera) {
VideoCapture cap(strCamera);
if (cap.isOpened()) {
while (true) {
Mat frame;
cap >> frame;
resize(frame, frame, Size(640, 480));
detect(frame, strCamera);
}
}
}
int main() {
thread cam1(stream, "rtsp://admin:password@ipaddress:554/live2.sdp?tcp");
thread cam2(stream, "rtsp://admin:password@ipaddress/live2.sdp?tcp");
cam1.join();
cam2.join();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我遇到了类似的问题,并且能够通过将帧捕获与图像处理完全隔离来解决这些问题。我还将 OpenCV 更新到了最新版本(3.2.0),但我认为这也将解决早期版本的问题。
void StreamLoop(String strCamera, LFQueue1P1C<Mat> *imageQueue, bool *shutdown) {
VideoCapture cap(strCamera, CV_CAP_FFMPEG);
Mat image;
while(!(*shutdown) && cap.isOpened()){
*cap >> image;
imageQueue->Produce(image);
}
}
int main(){
Mat aImage1;
bool shutdown(false);
LFQueue1P1C<Mat> imageQueue;
string rstp("rtsp://admin:password@ipaddress:554/live2.sdp?tcp");
thread streamThread(StreamLoop, rtsp, &imageQueue, &shutdown);
...
while(!shutdownCondition){
if(imageQueue.Consume(aImage1)) {
// Process Image
resize(aImage1, aImage1, Size(640, 480));
detect(aImage1, rtsp);
}
}
shutdown = true;
if(streamThread.joinable()) streamThread.join();
...
return 0;
}
Run Code Online (Sandbox Code Playgroud)
OpenCV 中的 rtsp 似乎存在一些问题,如果在拾取帧时出现轻微的停顿,它很容易挂起。只要我在没有太多停顿的情况下拾取帧,我就没有发现任何问题。
另外,当摄像机直接连接到我的本地网络时,我没有遇到这个问题。直到我们将它们部署在远程站点时,我才开始感到困惑。将帧检索和处理分离到单独的线程中解决了我的问题,希望其他人可能会发现这个解决方案有用。
注意:我使用的队列是一种自定义队列,用于将项目从一个线程传递到另一个线程。我发布的代码是在我的原始代码的基础上修改的,以使其更具可读性并适用于这个问题。
我仍然是多线程问题的初学者,所以任何帮助将不胜感激
无法退出的线程会在将来给您带来问题。即使是测试代码,也要养成确保代码有退出路径的习惯。举个例子:您可能稍后复制并粘贴一段代码,却忘记了其中存在无限循环,这会在稍后尝试追查为什么出现神秘崩溃或资源被锁定时造成巨大的痛苦。