gpt4 book ai didi

c++ - OpenCV 帧率问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:54 24 4
gpt4 key购买 nike

我正在使用 OpenCV 进行一个学校项目。该程序的主要部分将是直方图的比较。将有一个直方图数据库,新的直方图将从实时视频源创建,然后与数据库中的直方图进行比较。现在我只是想从视频源中正确创建直方图。 我的问题是程序在随机时间间隔内崩溃或速度急剧下降。所以我的问题是如何防止程序崩溃或变慢?OpenCV 对我来说一直有点不稳定,所以我不确定这是我的代码的问题还是只是OpenCV 的本质。如果它与我的代码有关,我认为这个问题可能与帧速率有关(猜测/直觉)。我正在使用“cvWaitKey”来“调整”帧的加载速度,但是“学习 OpenCV”一书对“cvWaitKey”有这样的说法

c = cvWaitKey(33);如果(c == 27)中断;显示帧后,我们将等待 33 毫秒。如果用户按下一个键,则 c将被设置为该键的 ASCII 值;如果不是,那么它将被设置为 –1。如果用户点击Esc 键(ASCII 27),然后我们将退出读取循环。否则,33 毫秒将过去,并且我们将再次执行循环。值得注意的是,在这个简单的例子中,我们并没有明确控制以任何智能方式播放视频的速度。我们完全依赖于定时器cvWaitKey() 来调整帧的加载速度。在更复杂的应用程序中,它会明智的做法是从 CvCapture 结构(来自 AVI)中读取实际帧速率,并且做出相应的行为!

您将在下面的代码(修改自 here)中看到我的循环在开始下一次执行之前等待 10 毫秒。很多时候程序会毫无问题地运行,但有时它会在不到一分钟或五分钟内崩溃,我确实无法检测到任何模式。 任何关于如何防止崩溃(或减速)的建议都将受到欢迎。另外我应该补充一点,我正在使用 OpenCV 1.1(无法让 OpenCV 2.0 正常工作),我是使用 Visual Studio 2008,我每次修改代码时都会创建一个 .MSI 安装程序包,也就是说,我不在 Visual Studio 中进行调试。依赖项是 cv110.dll、cxcore110.dll 和 highgui110.dll。我的代码如下:

// SLC (Histogram).cpp : Defines the entry point for the console application.

#include "stdafx.h"
#include <cxcore.h>
#include <cv.h>
#include <cvaux.h>
#include <highgui.h>
#include <stdio.h>
#include <sstream>
#include <iostream>

using namespace std;

int main(){

CvCapture* capture = cvCaptureFromCAM(0);

if(!cvQueryFrame(capture)){
cout<<"Video capture failed, please check the camera."<<endl;
}

else{
cout<<"Video camera capture successful!"<<endl;
};

CvSize sz = cvGetSize(cvQueryFrame(capture));

IplImage* image = cvCreateImage(sz, 8, 3);
IplImage* imgHistogram = 0;
IplImage* gray = 0;
CvHistogram* hist;

cvNamedWindow("Image Source",1);
cvNamedWindow("Histogram",1);

for(;;){

image = cvQueryFrame(capture);

//Size of the histogram -1D histogram
int bins = 256;
int hsize[] = {bins};

//Max and min value of the histogram
float max_value = 0, min_value = 0;

//Value and normalized value
float value;
int normalized;

//Ranges - grayscale 0 to 256
float xranges[] = {0, 256};
float* ranges[] = {xranges};

//Create an 8 bit single channel image to hold a grayscale version of the original picture
gray = cvCreateImage(cvGetSize(image), 8, 1);
cvCvtColor(image, gray, CV_BGR2GRAY);

//Planes to obtain the histogram, in this case just one
IplImage* planes[] = {gray};

//Get the histogram and some info about it
hist = cvCreateHist(1, hsize, CV_HIST_ARRAY, ranges,1);
cvCalcHist(planes, hist, 0, NULL);
cvGetMinMaxHistValue(hist, &min_value, &max_value);
printf("Minimum Histogram Value: %f, Maximum Histogram Value: %f\n", min_value, max_value);

//Create an 8 bits single channel image to hold the histogram and paint it white
imgHistogram = cvCreateImage(cvSize(bins, 50),8,3);
cvRectangle(imgHistogram, cvPoint(0,0), cvPoint(256,50), CV_RGB(255,255,255),-1);

//Draw the histogram
for(int i=0; i < bins; i++){
value = cvQueryHistValue_1D(hist, i);
normalized = cvRound(value*50/max_value);
cvLine(imgHistogram,cvPoint(i,50), cvPoint(i,50-normalized), CV_RGB(0,0,0));
}

cvFlip(image, NULL, 1);
cvShowImage("Image Source", image);
cvShowImage("Histogram", imgHistogram);

//Page 19 paragraph 3 of "Learning OpenCV" tells us why we DO NOT use "cvReleaseImage(&image)" in this section
cvReleaseImage(&imgHistogram);
cvReleaseImage(&gray);
cvReleaseHist(&hist);

char c = cvWaitKey(10);

//if ASCII key 27 (esc) is pressed then loop breaks
if(c==27) break;

}

cvReleaseImage(&image);
cvReleaseCapture(&capture);
cvDestroyAllWindows();

}

最佳答案

我只能看到或推荐一些东西:

考虑构建时,请确保您是在 Release 中构建。此外,请确保您使用的 OpenCV 构建是在启用 OpenMP 的情况下构建的,这会产生巨大的差异。

尝试将您的分配移到循环之外。您重新创建 gray 和其他图像的每个循环,当它们应该被重新使用时。

另一件事是你的风格,这使得很难轻易给出好的推荐。预先声明一堆变量是一种糟糕的风格,这是 C 风格。在使用之前声明您的变量,代码将更易于阅读。

关于c++ - OpenCV 帧率问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2413657/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com