gpt4 book ai didi

c++ - OpenCV 在 ROI 中绘制 Farneback 光流。

转载 作者:太空宇宙 更新时间:2023-11-03 23:14:37 25 4
gpt4 key购买 nike

我编写了一段代码来创建边界框并在其中绘制 Farneback 光流。光流通常是事先计算好的,然后为每个 ROI 框单独绘制。

当我绘制流程时,问题就来了。流量看起来正常,但向下和向右移动。这是输出,注意右下角有移动的人的流动。

person is moving but flow drawn in wrong place

这是到处都绘制了流的框架,显示了应该绘制流的位置。

Flow drawn everywhere to show where it should be

为了简单起见,附加的代码被精简了,所以如果有一些未声明的矩阵或其他东西,请原谅。

#include ...

using namespace cv;
using namespace std;

Mat currentImage, img, printr, gray ,prevgray, flow;

void getRectanglesandROI(Mat &Mask, Mat &imgTmp, Mat &imgOut, vector<Rect> &outBoxes);

void DrawFlowMap(Mat Image, Mat ROI, Rect Box, Point centre);

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

VideoCapture inVid("input.avi");

if (!inVid.isOpened()) {
cout << "Failed to open the input video" << endl;
exit(5);}

int loop=0, count =0, MaxTargets=0;
bool test=true;

namedWindow("Detected");

int ex = inVid.get(CV_CAP_PROP_FOURCC);
double fps = inVid.get(CV_CAP_PROP_FPS);
int wait=1000/fps;
Size S = Size( (int) inVid.get(CV_CAP_PROP_FRAME_WIDTH), (int) inVid.get(CV_CAP_PROP_FRAME_HEIGHT));
int fr =inVid.get(CV_CAP_PROP_FRAME_COUNT);

VideoWriter output; // Open the output
output.open("output.avi", ex, fps, S, true);
if (!output.isOpened())
{
cout << "Could not open the output video for write: " << endl;
return -1;
}
//=============4EVR=================
while(test){

inVid>>currentImage;
if (currentImage.empty())
{
count++;
//if (count==1){if (waitKey(0)==27){waitKey(2);}}
if (count==1){fs.release(); break;}
cout <<"Max Targets=" <<MaxTargets<< endl<< "End of video, looping" << endl<<endl;
inVid.set(CV_CAP_PROP_POS_AVI_RATIO, 0);
loop=0;
}

cvtColor(currentImage, gray,CV_RGB2GRAY);
if (prevgray.empty()){gray.copyTo(prevgray);}

currentImage.copyTo(img);

calcOpticalFlowFarneback(prevgray,gray,flow,0.5,3,21,20,5,1.2,0);

vector<Rect> outputBoxes;
getRectanglesandROI(fgMaskMOG2, img, currentImage, outputBoxes);
gray.copyTo(prevgray);

imshow("Detected", currentImage);
waitKey(wait);
}
return 0;
}
//============END===========================================================

void getRectanglesandROI(Mat &Mask, Mat &imgTmp, Mat &imgOut, vector<Rect> &outBoxes){

vector<vector<Point> > v;
vector<int> targets;
int tarArea=1;

findContours(Mask, v, CV_RETR_EXTERNAL/*CV_RETR_LIST*/, CV_CHAIN_APPROX_SIMPLE);

for (int j = 0; j < v.size(); j++) {
if (tarArea < v[j].size()) { // excluding tiny contours
targets.push_back(j);
}
}
for (int j = 0; j < targets.size(); j++) {
drawContours(imgTmp, v, targets[j], Scalar(255, 0, 255), 1, 8);
Rect rect = boundingRect(v[targets[j]]);

roi=currentImage(rect);
DrawFlowMap(currentImage, roi, rect);
}
}

void DrawFlowMap(Mat Image, Mat ROI, Rect Box){

Point pt1 = Point(Box.x, Box.y);

for( int y=0; y<roi.rows; y+=5){ //this is the issue area, probably.
for (int x=0;x<roi.cols;x+=5){
const Point2f& flowatxy=flow.at<Point2f>(y,x);

line(Image, Point(cvRound(pt1.x+x), cvRound(pt1.y+y)),
Point(cvRound(pt1.x+x+flowatxy.x), cvRound(pt1.y+y+flowatxy.y)), Scalar(0,255,0)); ///FLOW LINES
}
}
}

最佳答案

Easy peasy,看了一会儿图片(哭了)我注意到它在正确的地方画了流,但是那个地方的 flowatxy 是错误的。所以我将 flowatxy 声明更改为以下内容:

const Point2f& flowatxy=flow.at<Point2f>( pt1.y+y , pt1.x+x );

关于c++ - OpenCV 在 ROI 中绘制 Farneback 光流。,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42343933/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com