**已关闭。**此问题需要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.");
}
});
}
在应用中使用相机时,如何解决此问题并获得预期的帧速率?
1条答案
按热度按时间smdnsysy1#
因此,这个问题的解决方案在于使用WxWidgets将OpenCV正确集成到项目中。谢谢你的帮助!