gpt4 book ai didi

c++ - Opencv-如何在Haar分类器串级中计算到摄像机的移动物体距离和速度?

转载 作者:行者123 更新时间:2023-12-02 16:41:13 24 4
gpt4 key购买 nike

我正在研究 Opencv项目,正在使用C++。我被困在计算运动物体的距离和速度。

问题:

I have detected moving cars in video using Haar classifier in Opencv.
But didn't find any way to calculate moving objects
distance from camera as well as moving objects speed.
I want to achieve this using only 1 Camera. I am not using Stereo vision.
这是我的代码:
#include <stdio.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>

CvHaarClassifierCascade *cascade;
CvMemStorage *storage;

void detect(IplImage *img);

int main(int argc, char** argv)
{
CvCapture *capture;
IplImage *frame;
int input_resize_percent = 100;

if(argc < 3)
{
std::cout << "Usage " << argv[0] << " cascade.xml video.avi" << std::endl;
return 0;
}

if(argc == 4)
{
input_resize_percent = atoi(argv[3]);
std::cout << "Resizing to: " << input_resize_percent << "%" << std::endl;
}

cascade = (CvHaarClassifierCascade*) cvLoad(argv[1], 0, 0, 0);
storage = cvCreateMemStorage(0);
capture = cvCaptureFromAVI(argv[2]);

assert(cascade && storage && capture);

cvNamedWindow("video", 1);

IplImage* frame1 = cvQueryFrame(capture);
frame = cvCreateImage(cvSize((int)((frame1->width*input_resize_percent)/100) , (int)((frame1->height*input_resize_percent)/100)), frame1->depth, frame1->nChannels);

const int KEY_SPACE = 32;
const int KEY_ESC = 27;

int key = 0;
do
{
frame1 = cvQueryFrame(capture);

if(!frame1)
break;

cvResize(frame1, frame);

detect(frame);

key = cvWaitKey(10);

if(key == KEY_SPACE)
key = cvWaitKey(0);

if(key == KEY_ESC)
break;

}while(1);

cvDestroyAllWindows();
cvReleaseImage(&frame);
cvReleaseCapture(&capture);
cvReleaseHaarClassifierCascade(&cascade);
cvReleaseMemStorage(&storage);

return 0;
}

void detect(IplImage *img)
{
CvSize img_size = cvGetSize(img);
CvSeq *object = cvHaarDetectObjects(
img,
cascade,
storage,
1.1, //1.1,//1.5, //-------------------SCALE FACTOR
1, //2 //------------------MIN NEIGHBOURS
0, //CV_HAAR_DO_CANNY_PRUNING
cvSize(0,0),//cvSize( 30,30), // ------MINSIZE
img_size //cvSize(70,70)//cvSize(640,480) //---------MAXSIZE
);

std::cout << "Total: " << object->total << " cars" << std::endl;
for(int i = 0 ; i < ( object ? object->total : 0 ) ; i++)
{
CvRect *r = (CvRect*)cvGetSeqElem(object, i);
cvRectangle(img,
cvPoint(r->x, r->y),
cvPoint(r->x + r->width, r->y + r->height),
CV_RGB(255, 0, 0), 2, 8, 0);
}

cvShowImage("video", img);
}
如果您有任何示例,请提供更好的理解。它的赞赏。
谢谢

最佳答案

我怀疑精度,但是下面提到的方法可以在某种程度上帮助您找到物体(运动)的距离。

  • 步骤:
  • 找到合适的网络来馈送帧,以标识视频中的对象。
  • 获取检测的坐标,也许我们可以进一步找到检测的长度/面积。
  • 在执行所有操作之前,请找到相机的焦距,并将已知尺寸的物体放置在已知距离处。(请参阅Adrian pyimagesearch网站)。
  • 在已知焦距和已知大小的移动物体的情况下,我们可以随着检测到的帧的面积变化找到物体移动时的距离。
  • 关于c++ - Opencv-如何在Haar分类器串级中计算到摄像机的移动物体距离和速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21232301/

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