实时多个视频的多个物体检测,同时校正图像失真

时间:2015-03-12 12:33:09

标签: c++ opencv video camera object-detection

我正在开展一个项目,我试图同时检测多个视频中的多个对象,我也在纠正视频中的失真,这样我就可以准确读取轴承检测相对于相机。

我使用Visual Studio 2010在C ++中使用OpenCV

代码有效,但速度很慢,不是实时。我希望有人可以提出建议,如果可以,可以加快速度。我目前没有太多的编码器和学习图像处理,也不知道很多技巧。

一般意义上代码的作用是:

- 暂停视频文件

- 对每个图像帧(轴承)应用失真校正

覆盖图像(改进检测,时间戳给出误报)

- 将Haar类型级联应用于裁剪图像以检测对象

- 在检测周围绘制一个边界框

- 显示图像

- 计算对象检测的角度并打印到终端

- 它还可以像雷达一样绘制图像,并在每个帧中显示相对于每个检测的相机的角度,我们的想法是将其作为单个源,在单个源上映射出每个摄像机的检测结果周边地区。

我已经包含了运行视频的主要代码和单个视频的检测,这仍然非常慢并需要大约。每秒视频18秒。当我有4个视频试图运行时,大约要长3倍。

视频尺寸为704x576。

任何帮助或建议都会非常感激,甚至只知道它只能用专门设计的硬件来加速。

干杯, 戴夫

int main(){

/////////////////////////////
//**Distortion Correction**//
/////////////////////////////

std::cout<< endl << "Reading:" << endl;
//stores a file
FileStorage fs;
//reads and stores the xml file with the camera calibration
fs.open("cal2.xml", FileStorage::READ);

if (fs.isOpened()) 
{
    cout<<"File is opened\n";

}


//Mat objects to store the camera matrix and distortion coefficients
Mat CamMat, DistCoeff;

FileNode n = fs.root();

//takes the parameters from the xml file and stores them in the Mat objects
fs["Camera_Matrix"] >> CamMat;
fs["Distortion_Coefficients"] >> DistCoeff;


/////////////////////
//**Video Display**//
/////////////////////

//Mat objects to store the images
Mat Original, Vid1, Vid1Crop;

//Cropping Image to exclude time/camera stamps to improve detections
Rect roi(0, 35, 704, 490);

//for reading video or webcam
VideoCapture cap;
//for opening video file, give the location and name of the file seperating folders with "\\" instead of with a single "\"
cap.open("C:\\Users\\Desktop\\Run_01_005 two containers\\Video\\ch04_20140219124355.mp4");


//Windows for the images
namedWindow("New", CV_WINDOW_NORMAL);
namedWindow("Display", CV_WINDOW_NORMAL);

///////////////////////
//**Detection Setup**//
///////////////////////

// Cascade Classifier object
CascadeClassifier boat_cascade;

//loads the xml file for the classifier, put the address and name of the xml file in the brackets
boat_cascade.load( "boatcascadeAttp3.xml" );

/////////////////////////////////////
//**Single Source Display Image**////
/////////////////////////////////////
Mat Output; 

//loop to continually capture/update images
    while (1){

    Output = Display();


        cap>>Original;

        //applies the distortion correction to input image and outputs to New image
        undistort(Original, Vid1, CamMat, DistCoeff, noArray());

        //Image excluding the time/camera stamps in video which caused a lot of false positives
        Vid1Crop = Vid1(roi);
        //Set.NewCrop(New, roi);

        // Detect boats
        std::vector<Rect> boats;
        //Parameters may need some further adjustment, currently seems to work well
        //Detection performed on Region of Interest that excludes the time stamp which caused a number of False Positives
        boat_cascade.detectMultiScale( Vid1Crop, boats, 1.1, 15, 0|CV_HAAR_SCALE_IMAGE, Size(25, 25), Size(75,75) );

        // Draw circles on the detected boats
        for( int i = 0; i < boats.size(); i++ )
        {

            //Draws a box around the detected object
            rectangle( Vid1Crop, Point(boats[i].x, boats[i].y), Point(boats[i].x+boats[i].width, boats[i].y+boats[i].height), Scalar( 0, 255, 0), 2, 8);

            //finds the position of the detection along the X axis
            int centreX = boats[i].x + boats[i].width*0.5;
            int fromCent = Vid1Crop.cols - centreX;

            float angle;

            //calls Angle function
            angle = Angle(centreX, fromCent, Vid1Crop);

            //calls DisplayPoints function
            Point XYpoints = DisplayPoints(angle);

            //prints out the result, angle for cam ranges
            cout << angle;
            cout << " degrees" << endl;
            //Draws red circles on the single source display corresponding to the detections
            circle( Output, XYpoints, 5.0, Scalar( 0, 0, 255 ), 4, 8 );
}

        //shows the New output image after correction
        imshow("New", Vid1);
        imshow("Display", Output);

        //delay for 1ms between frames  -  Note 25 fps in video
        waitKey(1);

}


fs.release();
return (0);

}

0 个答案:

没有答案