Opencv:从calcOpticalFlowFarneback为kmeans安排样本向量 - “错误:样本未在此范围内声明”

时间:2017-01-20 08:12:14

标签: opencv k-means opticalflow

我正在尝试使用光流从静态相机中检测物体(人,车),然后最终从中获取其他信息。我正在坚持将光流向量移动到kmeans满意的样本向量数组中。

这是我的代码:

int main(int argc, char *argv[]){

Mat img,labels, original,flow, centres;
UMat prevgray, flowUmat, gray;

int count=0,clusterCount=4, size, loop=0, val=0.1, k=4;

VideoCapture cap("cars.avi");
if(!cap.isOpened())
{
    printf("Error 404: no video found\n");
    return 0;
}
else printf("Capture from file successfull!!\n");
///forever loop
for(;;) {
cap >>img;
if (!cap.grab())
{
    cout << "\n Cannot read the frame from video file" << endl;
    if(waitKey(0)==27){break;}
}
img.copyTo(original);
cvtColor(img, gray, CV_RGB2GRAY);
//================
///     FLOW
//================
if (prevgray.empty() == false ) {
    calcOpticalFlowFarneback(prevgray,gray,flowUmat, 0.4,1,50,2,5,1.2,0); //0.5,3,21,20,5,1.1
    flowUmat.copyTo(flow);

    //arranging sample vectors
    std::vector<cv::Point2f> samples (flowUmat.rows*flowUmat.cols);
    int n=0;
    for( int y=0; y<flowUmat.rows; y++){
        for (int x=0;x<flowUmat.cols;x++){
            const Point2f& flowatxy=flow.at<Point2f>(y,x);
            line(original, Point(x,y), Point(cvRound(x+flowatxy.x*4), cvRound(y+flowatxy.y*4)), Scalar(0,255,0));
            circle(original, Point(x,y), 0.1, Scalar(0,0,0),-1);
            samples[n++] = flow.at<cv::Point2f>(y,x);
        }
    }
gray.copyTo(prevgray);
}
else
    img.copyTo(prevgray);

///PROBLEM AREA
kmeans(samples, k, labels, TermCriteria(TermCriteria::EPS+TermCriteria::COUNT,10,1.0),3,KMEANS_PP_CENTERS,centres);

waitKey(1);
std::swap(prevgray, gray);
loop++;
}
return 0;
}

它返回的错误读取“错误:'范例'未在此范围内声明”。

我在编码方面比较差,所以任何帮助都会受到赞赏。

0 个答案:

没有答案