在从相机读取帧时,OpenCV [[mjpeg @ 0000000000428480]覆盖8]

时间:2015-10-08 11:30:22

标签: c++ opencv ffmpeg

我有一个非常烦人的OpenCV错误,我无法理解和处理。 我写了一个从ip camera获取mjpg流的应用程序,然后处理它,但是当我尝试从流中加载图像时,有时候我有

[mjpeg @ 0000000000428480] overread 8

错误,我不知道为什么。 即使我尝试跳过此问题,并尝试从流中加载下一帧,应用程序也会停留在

frameStatus = cameraHandler->read(mat);

这是连接建立的代码:

void ImageProcessor::connectWithCamera(VideoCapture * cameraHandler) {
    if (cameraHandler != nullptr) {
        Logger::log("Closing existing camera stream.");
        cameraHandler->release();
        delete cameraHandler;
    }
    Logger::log("Camera configuration and connection establishing.");
    cameraHandler = new VideoCapture();
    cameraHandler->set(CV_CAP_PROP_FRAME_WIDTH, config.RESOLUTION_WIDTH);
    cameraHandler->set(CV_CAP_PROP_FRAME_HEIGHT, config.RESOLUTION_HEIGHT);
    cameraHandler->set(CV_CAP_PROP_FPS, config.CAMERA_FPS);
    cameraHandler->set(CV_CAP_PROP_FOURCC, CV_FOURCC('M', 'J', 'P', 'G'));
    while (!cameraHandler->open(config.LINK)) {
        Logger::log("Cannot connect to camera! Trying again.");
    }
}

这是捕获图像的代码:

void ImageProcessor::start() {

    VideoCapture * cameraHandler = new VideoCapture();
    this->connectWithCamera(cameraHandler);
    this->connectWithServer(this->serverConnection);

    Logger::log("Id sending.");
    serverConnection->send(config.TOKEN + "\n");
    Logger::log("Computations starting.");

    Mat mat;
    Result * result = nullptr;
    int delta = 1000 / cameraHandler->get(CV_CAP_PROP_FPS);
    char frameErrorCounter = 0;
    bool frameStatus;

    while (true) {
        frameStatus = false;
        cv::waitKey(delta);

        try {
            frameStatus = cameraHandler->read(mat);
        } catch (std::exception& e) {
            std::string message = e.what();
            Logger::log("Critical camera error! : " + message);
        }

        if (!frameStatus) {
            Logger::log("Cannot read a frame from source. ");
            ++frameErrorCounter;
            if (!cameraHandler->isOpened() || frameErrorCounter >= this->GET_FRAME_ERROR_COUNTER) {
                Logger::log("Probably camera is disconnected. Trying to establish connection again.");
                frameErrorCounter = 0;
                this->connectWithCamera(cameraHandler);
                Logger::log("Computations starting.");
            }
            continue;
        }

        result = processImage(mat);

        std::string stringResult;
        if (result == nullptr) {
            stringResult = this->NO_RESULT;
            delete result;
            result = nullptr;
        } else {
            stringResult = result->toJson();
        }

        if (!serverConnection->send(stringResult)) {
            Logger::log("Server connection lost, trying to establish it again.");
            serverConnection->close();
            while (!serverConnection->isOpen()) {
                this->connectWithServer(serverConnection);
            }
        }

        mat.release();
    }

}

提前致谢!

0 个答案:

没有答案