使用OpenCv延迟播放AVI

使用OpenCv延迟播放AVI,opencv,delay,avi,Opencv,Delay,Avi,我正在通过opencv播放avi,并试图在视频中进行一些圆检测。只是播放视频是伟大的,但当我试图检测圆圈,视频减慢。有没有办法让视频以接近录制速度的速度播放 #include <stdio.h> #include <cv.h> #include <highgui.h> #include <math.h> int main(int argc, char** argv) { IplImage*img; int key=0; CvCa

我正在通过opencv播放avi,并试图在视频中进行一些圆检测。只是播放视频是伟大的,但当我试图检测圆圈,视频减慢。有没有办法让视频以接近录制速度的速度播放

#include <stdio.h>
#include <cv.h>
#include <highgui.h>
#include <math.h>

int main(int argc, char** argv)
{
    IplImage*img;
   int key=0;

 CvCapture*capture = cvCaptureFromAVI("C:\\Users\\Nathan\\Desktop\\SnookVid.wmv");

 if(!capture) return 1;

int fps = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);

cvNamedWindow("circles", 0);


while(key!='q'){
    img = cvQueryFrame( capture );

    if(!img) break;


IplImage* gray = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
//IplImage* hsv = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
CvMemStorage* storage = cvCreateMemStorage(0);

//covert to grayscale
cvCvtColor(img, gray, CV_BGR2GRAY);

// This is done so as to prevent a lot of false circles from being detected
cvSmooth(gray, gray, CV_GAUSSIAN, 3, 5);

IplImage* canny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
//IplImage* rgbcanny = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
//cvCanny(gray, canny, 50, 70, 3);

//detect circles
CvSeq* circles = cvHoughCircles(gray, storage, CV_HOUGH_GRADIENT, 1, 27, 70, 40,0,0);
//cvCvtColor(canny, rgbcanny, CV_GRAY2BGR);
//cvCvtColor(img,hsv, CV_BGR2HSV);
//draw all detected circles
float* p;
CvScalar s;
int num_red = 22;
for (int i = 0; i < circles->total; i++)
{
     // round the floats to an int
     p = (float*)cvGetSeqElem(circles, i);
     cv::Point center(cvRound(p[0]), cvRound(p[1]));
     int radius = cvRound(p[2]);

     //uchar* ptr;
     //ptr = cvPtr2D(img, center.y, center.x, NULL);
     //printf("B: %d G: %d R: %d\n", ptr[0],ptr[1],ptr[2]);


     s = cvGet2D(img,center.y, center.x);//colour of circle
    printf("B: %f G: %f R: %f\n",s.val[0],s.val[1],s.val[2]);
}
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
IplImage*img;
int键=0;
CvCapture*capture=cvCaptureFromAVI(“C:\\Users\\Nathan\\Desktop\\SnookVid.wmv”);
如果(!capture)返回1;
int fps=(int)cvGetCaptureProperty(捕获,CV_CAP_PROP_fps);
cvNamedWindow(“圆”,0);
while(键!='q'){
img=cvQueryFrame(捕获);
如果(!img)中断;
IplImage*gray=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
//IplImage*hsv=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
CvMemStorage*storage=cvCreateMemStorage(0);
//隐到灰度
CVT颜色(img、灰色、CV_bgr2灰色);
//这样做是为了防止检测到大量假圆
cvSmooth(灰色、灰色、CV_高斯、3、5);
IplImage*canny=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
//IplImage*rgbcanny=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);
//cvCanny(灰色,canny,50,70,3);
//检测圆
CvSeq*圆=cvHoughCircles(灰色,存储,CV_-HOUGH_梯度,1,27,70,40,0,0);
//CVTColor(canny、rgbcanny、CV_GRAY2BGR);
//CVT颜色(img、hsv、CV_BGR2HSV);
//绘制所有检测到的圆
浮动*p;
cvs;
int num_red=22;
对于(int i=0;itotal;i++)
{
//将浮点数四舍五入为整数
p=(float*)cvGetSeqElem(圆,i);
cv::点中心(cvRound(p[0]),cvRound(p[1]);
int radius=cvRound(p[2]);
//乌查尔*ptr;
//ptr=cvPtr2D(img,center.y,center.x,NULL);
//printf(“B:%d G:%d R:%d\n”,ptr[0],ptr[1],ptr[2]);
s=cvGet2D(img,center.y,center.x);//圆的颜色
printf(“B:%f G:%f R:%f\n”,s.val[0],s.val[1],s.val[2]);
}

在使用
HoughCircles
或进行处理之前,请尝试减小图像大小

如果要将检测到的圆与原始图像一起使用,请将半径和圆心乘以除以图像的系数。2倍的缩放比例将使处理时间缩短2-4倍,减去执行缩放操作所需的时间

下面是一个简短的示例,说明您可能会如何进行此操作:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <iostream>

using namespace std;
using namespace cv;


int main(int argc, char** argv)
{
    Mat circleBig = imread("circle.png", 0);
    Mat circleSmall;

    double scale = 2.0;

    // INTER_NEAREST is crude, but very fast; you may need INTER_LINEAR here...
    resize(circleBig, circleSmall, Size(0, 0), 1.0 / scale, 1.0 / scale, cv::INTER_NEAREST);

    cvtColor(circleBig, circleBig, CV_GRAY2RGB);

    vector<Vec3f> circles;
    HoughCircles(circleSmall, circles, CV_HOUGH_GRADIENT, 2, circleSmall.rows >> 2, 200, 100 );

    for( size_t i = 0; i < circles.size(); i++ )
    {
         Point center(cvRound(circles[i][0]), cvRound(circles[i][3]));
         int radius = cvRound(circles[i][4]);
         // draw the circle center
         circle( circleBig, scale*center, 3, Scalar(0,255,0), -1, 8, 0 );
         // draw the circle outline
         circle( circleBig, scale*center, scale*radius, Scalar(0,0,255), 3, 8, 0 );
    }

    imshow("circleBig", circleBig);
    waitKey();

    return 0;
}

大致来说,3倍的加速!:)

你可以试试mevatron的建议,它肯定会有所不同,这就是为什么我投了更高的票

但有一点需要明确:视频变慢不是源代码中的错误,也不是OpenCV中的错误。这种影响是由CPU必须花费处理时间来对视频的每一帧执行圆检测造成的。CPU无法快速执行此任务,从而使您感觉到实时的


这个问题的标题有点误导,因为你不仅仅是在用OpenCV播放AVI。

我已经在上面输入了我的代码。如何调整整个视频的大小?在调用
HoughCircles
函数之前,只需一次调整一帧大小。在开始处理之前,你不必调整整个视频的大小,所以你可以调整大小r
img
矩阵到
imgSmall
矩阵,然后在
imgSmall
上计算
houghscircles
,就像在我的示例中一样。因此,只需在cvQueryFrame(捕获)之后放置resize(circleBig,circleSmall,Size(0,0),1.0/刻度,1.0/刻度,cv::INTER_NEAREST)是的,但是如果你能帮助它,不要混合C和C++ API。使用<代码> CVReSige。它的文档在我发布的链接中,用于代码>调整大小< /C>。在C API的大小上没有指定的缩放因子。这有关系吗?
640x480 time: 0.0127101
320x240 time: 0.00408843