在C++中使用OpenCV、线程和wxwidgets时的帧速率(FPS)问题[关闭]

hk8txs48  于 2023-10-21  发布在  其他
关注(0)|答案(1)|浏览(115)

**已关闭。**此问题需要debugging details。它目前不接受回答。

编辑问题以包括desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将帮助其他人回答这个问题。
昨天关门了。
Improve this question
我在使用笔记本电脑摄像头时遇到帧速率(FPS)问题(属性:width = 640,height = 480,backend = DSHOW)在我的C++ Windows 10应用程序中使用OpenCV 4.6和WxWidgets 3.2.2.1来创建界面。
问题只发生在我的应用程序中,而不是简单的测试代码中。一切正常,如果我运行以下代码示例,我将获得高帧速率(FPS):

#include <opencv2/opencv.hpp>
#include <iostream>

int main() {
    cv::VideoCapture camera(0); 
    if (!camera.isOpened())  
        std::cout << "Camera it not opened!\n";
    cv::Mat edges;
    cv::Mat frame;
    cv::namedWindow("edges", 1);

    for (;;) {
        if (!camera.read(frame)) 
            break;

        cvtColor(frame, edges, cv::COLOR_BGR2GRAY);
        imshow("edges", frame);
        if (cv::waitKey(30) >= 0) break;
    }

    return 0;
}

然而,当我尝试在应用程序中使用相同的相机时,我每秒只能获得一帧。每秒一帧是非常少的。下面是我的应用程序的示例代码:

class VideoManager {
public:
    VideoManager( );
    ~VideoManager( );
    bool openCamera(int cameraIndex);
 
    void startCapture( );
 
private:
    cv::VideoCapture camera;
    int cameraIndex{};
    std::thread captureThread;
 
};

bool VideoManager::openCamera(int cameraIndex) {
    camera.open(cameraIndex);
    return camera.isOpened();
}

void VideoManager::startCapture() {
    if (!camera.isOpened()) {
        wxLogError("Camera is not opened.");
        return;
    }

    isCapturing = true;
    captureThread = std::thread([this]() {
    // test: open window to show video
    cv::Mat edges;
    cv::Mat frame;
    cv::namedWindow("edges", 1);

    while (isCapturing) {

        if (!camera.read(frame)) {
               wxLogError("Not a single frame was captured.");
        }

        cv::circle(frame, cv::Point(frame.cols / 2, frame.rows / 2), 10, cv::Scalar(0, 0, 255), 2); // Red circle

        // Adding the current time to the top left corner
         addTimestamp(frame);

        // test: open window to show video
        cvtColor(videoInfo.frame, edges, cv::COLOR_BGR2GRAY);
        cv::imshow("edges", videoInfo.frame);
        if (cv::waitKey(30) >= 0) break;

        // wxLogDebug("Sent video frame to client.");
        }
        });
}

在应用中使用相机时,如何解决此问题并获得预期的帧速率?

smdnsysy

smdnsysy1#

因此,这个问题的解决方案在于使用WxWidgets将OpenCV正确集成到项目中。谢谢你的帮助!

相关问题