簡體   English   中英

cvCalcOpticalFlowHS()opencv拋出異常

[英]Exception thrown for cvCalcOpticalFlowHS() opencv

嘿,我正在嘗試解決openCV的光流功能,但出於某種原因,我在visual studio中遇到異常:

Optical_flow.exe中0x772615de處的未處理異常:Microsoft C ++異常:cv ::內存位置0x0036f334的異常..

通過斷點,我發現錯誤位於cvCalcOpticalFlowHS函數中。

我正在使用openCV 2.1

#include <cv.h>
#include <highgui.h>
using namespace cv;

int init() {
  return 0;
}

int main(int argc, char **args) {
  CvCapture* capture = cvCaptureFromFile("Video/Wildlife.wmv");
  double fps = cvGetCaptureProperty(capture, CV_CAP_PROP_FPS);

  CvSize size;
  size.width = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_WIDTH);
  size.height = (int)cvGetCaptureProperty(capture, CV_CAP_PROP_FRAME_HEIGHT);

  CvVideoWriter* writer = cvCreateVideoWriter("result.avi", 0, fps,size, 1);

  IplImage* curFrame = cvQueryFrame(capture);

  Mat u = Mat(size, CV_32FC2);
  Mat v = Mat(size, CV_32FC2);

  CvTermCriteria IterCriteria;
  IterCriteria.type = CV_TERMCRIT_ITER | CV_TERMCRIT_EPS;
  IterCriteria.max_iter = 500;
  IterCriteria.epsilon = 0.01;

  while(1) {
    IplImage* nextFrame = cvQueryFrame(capture);

    if(!nextFrame) break;

    u = Mat::zeros(size, CV_32FC2);
    v = Mat::zeros(size, CV_32FC2);

    /* Do optical flow computation */
    cvCalcOpticalFlowHS(&curFrame, &nextFrame, 0, &u, &v, 0.01, IterCriteria);

    cvWriteFrame(writer, curFrame);

    curFrame = nextFrame;
  }

  cvReleaseVideoWriter(&writer);
  cvReleaseCapture(&capture);

  return 0;
}

有沒有人見過這個問題或看到我犯的錯誤?

最好的祝福

REMCO

文檔中 ,curFrame和nextFrame應該是8位單通道。 您目前只是從加載的文件中提取這些內容而不檢查/轉換它們。 你能確認輸入是正確的類型嗎?

你也有一個令人討厭的C ++風格的cv :: Mat和C風格的IplImage *。 我建議你升級到更新版本的OpenCV(2.4最近已經發布),並嘗試堅持使用C ++或C風格的一種或另一種方法。

另請注意,此光流方法被歸類為過時,建議對稀疏要素使用calcOpticalFlowPyrLK()或對密集要素使用calcOpticalFlowFarneback()

下面是一些示例代碼,演示了calcOpticalFlowFarneback(),這是我相信你想要實現的。 它從網絡攝像頭而不是文件中獲取數據。

#include <opencv2/opencv.hpp>

using namespace cv;

void drawOptFlowMap(const cv::Mat& flow,
                    cv::Mat& cflowmap,
                    int step,
                    const cv::Scalar& color
                   )
{
    for(int y = 0; y < cflowmap.rows; y += step)
        for(int x = 0; x < cflowmap.cols; x += step)
        {
            const cv::Point2f& fxy = flow.at<cv::Point2f>(y, x);
            cv::line(cflowmap,
                             cv::Point(x,y),
                             cv::Point(cvRound(x+fxy.x),cvRound(y+fxy.y)),
                 color);
            cv::circle(cflowmap, cv::Point(x,y), 2, color, -1);
        }
}

int main(int argc, char **args) {

    VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
        return -1;

    Mat newFrame, newGray, prevGray;


    cap >> newFrame; // get a new frame from camera
    cvtColor(newFrame, newGray, CV_BGR2GRAY);
    prevGray = newGray.clone();

    double pyr_scale = 0.5;
    int levels = 3;
    int winsize = 5;
    int iterations = 5;
    int poly_n = 5;
    double poly_sigma = 1.1;
    int flags = 0;

    while(1) {
        cap >> newFrame;
        if(newFrame.empty()) break;
        cvtColor(newFrame, newGray, CV_BGR2GRAY);

        Mat flow = Mat(newGray.size(), CV_32FC2);

        /* Do optical flow computation */
        calcOpticalFlowFarneback(
            prevGray,
            newGray,
            flow,
            pyr_scale,
            levels,
            winsize,
            iterations,
            poly_n,
            poly_sigma,
            flags
            );

        drawOptFlowMap(flow, newFrame, 20, CV_RGB(0,255,0));

        namedWindow("Output",1);
        imshow("Output", newFrame);
        waitKey(1);

        prevGray = newGray.clone();
    }

    return 0;
}

上面的代碼非常類似於OpenCV附帶的fback.cpp示例代碼。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM