광학 흐름을 사용하는 세분화를 위해 SO 응답 중 하나에서 밀도가 높은 광학 흐름이 필요합니다. 나는 this code을 수정했다. 그것은 연속적인 두 프레임 사이의 조밀 한 유동장을 계산하기 위해 calcOpticalFlowFarneback 함수를 사용합니다.OpenCV C++ 옵티컬 플로를 기반으로하는 분할 코드에서 예외가 발생합니다.
SQRT를 사용하여 변위의 크기를 계산하기 위해 시도 (displacement_in_x^2 + displacement_in_y^2)
함수 CV_32FC2
으로 변위를 반환
이것은 내 코드입니다. -
#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include <iostream>
using namespace cv;
using namespace std;
void drawOptFlowMap(const Mat& flow, Mat& cflowmap, int step,
double scale, const Scalar& color)
{
for(int y = 0; y < cflowmap.rows; y += step)
for(int x = 0; x < cflowmap.cols; x += step)
{
const Point2f& fxy = flow.at<Point2f>(y, x);
line(cflowmap, Point(x,y), Point(cvRound(x+fxy.x), cvRound(y+fxy.y)),
color);
circle(cflowmap, Point(x,y), 2, color, -1);
}
}
int main()
{
VideoCapture cap("vip.avi");
if(!cap.isOpened())
return -1;
Mat prevgray, gray, flow, cflow, frame;
double col = cap.get(CV_CAP_PROP_FRAME_WIDTH);
double row = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
Mat flow_img = Mat::zeros(row,col,CV_8UC1);
namedWindow("flow", 1);
namedWindow("segmented",1);
for(;;)
{
cap >> frame;
cvtColor(frame, gray, CV_BGR2GRAY);
if(prevgray.data)
{
calcOpticalFlowFarneback(prevgray, gray, flow, 0.5, 3, 15, 15, 5, 1.2, 0);
cvtColor(prevgray, cflow, CV_GRAY2BGR);
drawOptFlowMap(flow, cflow, 8, 1.5, CV_RGB(0, 255, 0));
imshow("flow", cflow);
}
//This part I added to compute Magnitude of flow
for(int i=0;i<gray.rows;i++)
for(int j=0;j<gray.cols;j++)
flow_img.at<uchar>(i,j)= cvRound( sqrt (pow (flow.at<Vec2f>(i,j)[0] ,2)+ pow (flow.at<Vec2f>(i,j)[1],2)));
//threshold image
threshold(flow_img,flow_img,10,255,THRESH_BINARY); //some arbitrary thresh value 10
imshow("segmented",flow_img);
if(waitKey(30)>=0)
break;
std::swap(prevgray, gray);
}
return 0;
}
Microsoft Visual C++ 2010을 사용하고 있으며 빌드 오류가 없습니다. 그러나이 프로그램은 늘 다음과 같은 실행 던졌습니다 :
를 내가받을 콘솔 창에서 :
나는 내가 실수를 한 곳 이해 해달라고. 아무도 나를 도와주세요. 비슷한 질문이 here 있었고 대답은 제가 사용한 코드입니다. 아직도 내가 문제가
내 입력 비디오 찾을 수 있습니다 위에서 언급 얻을here 또는
어떤 줄에서 예외가 발생합니까? Visual Studio는 코드를 디버깅하여 검사하지 않으면이를 표시하여 표시해야합니다. – cyriel
그것은 아무것도 표시하지 않습니다 ... 창 (내 qn에서 업데이트 된) 이미지를 보여주는 팝업 ... 내가 그것을 디버깅 할 때 어떤 문제가 표시되지 않습니다 ... 코드는 몇 초 동안 흐름 벡터의 출력을 표시하고 표시 종료 위 .. –
어딘가에 thie avi 파일 업로드 - 내가 확인합니다, 그래서 나는 그것을 스스로 확인할 수 있습니다. – cyriel