Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV帧速率问题_C++_Crash_Opencv_Performance_Slowdown - Fatal编程技术网

C++ OpenCV帧速率问题

C++ OpenCV帧速率问题,c++,crash,opencv,performance,slowdown,C++,Crash,Opencv,Performance,Slowdown,我正在用OpenCV做一个学校项目。该程序的主要部分是直方图的比较。将有一个直方图数据库,新直方图将从实时视频源创建,然后与数据库中的直方图进行比较。现在我只是想从视频提要中正确创建直方图我的问题是程序以随机间隔崩溃或急剧减速。因此,我的问题是如何防止程序崩溃或减速?OpenCV对我来说总是有点古怪,所以我不确定这是我的代码的问题还是OpenCV的本质问题。如果这与我的代码有关,我认为问题可能与帧速率有关(猜测/直觉)。我使用“cvWaitKey”来“调整”帧的加载速度,但是“学习OpenCV”

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

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

您将在下面的代码(修改自)中看到,我的循环在开始下一次执行之前等待了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();

}
//SLC(直方图).cpp:定义控制台应用程序的入口点。
#包括“stdafx.h”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(){
CvCapture*capture=cvCaptureFromCAM(0);
如果(!cvQueryFrame(捕获)){

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

考虑到构建,确保您是在发行版中构建的。另外,确保您使用的OpenCV的构建是在启用OpenMP的情况下构建的,这会产生巨大的差异

尝试将您的分配移到循环之外。您正在创建的每个循环都是
灰色的
和其他图像,它们应该在何时重新使用


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

更新:我发现了问题,实际上是我的硬件(我认为是驱动程序)。我之所以使用PS3 Eye是因为它的帧速率非常惊人,但出于某种原因OpenCV并不总是喜欢PS3 Eye。有时它工作得很好,但有时不太好。我已经在三台计算机上验证了这一点,所有这些计算机都使用标准的网络摄像头运行我的代码,但在使用PS3 Eye时会随机锁定。不过,感谢您的支持建议GMan!

我现在必须走了,但类似的东西是你应该寻找的。避免不断的动态分配,尝试将其移出循环。你能详细说明一下吗?你是说OpenMP版本没有那么多bug还是类似的东西?我最初尝试使用2.0(来自sourceforge)但我不能在Visual Studio 2008中正确地链接它。我最终使用了我的书使用的旧版本(版本1.1,以前在SooCoFoW上)。我也会尝试改进我的风格,正如你所说的,我是C++的新手(所有的编程都是如此),所以我确信我的“风格”。将随时间发展:)OpenMP是一个多线程扩展。启用它后,OpenCV的性能可以显著提高。我已经玩了一段时间了,如果我错了,请纠正我的错误,但是如果我将灰色移到循环外,它将不会随循环的每个过程而更新,因此直方图将不会更新。我认为我每次循环都要重新创建灰色,以使此代码正常工作。@键入:您移出了什么?您应该能够移出此代码:
gray=cvCreateImage(cvGetSize(image),8,1);
和匹配的版本。