私はopencvで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;
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]);
}
私は上記の私のコードを入れました。どのようにビデオ全体のサイズを変更しますか? –
'HoughCircles'関数を呼び出す前に一度に1フレームずつサイズを変更するだけです。処理を開始する前にビデオ全体のサイズを変更する必要はないので、 'img'マトリックスを' imgSmall'マトリックスにリサイズし、私の例のように 'imgSmall'で' HoughCircles'を計算します。 – mevatron
だからちょうどresize(circleBig、circleSmall、Size(0、0)、1.0/scale、1.0/scale、cv :: INTER_NEAREST);後でcvQueryFrame(キャプチャ) –