Frage

Im tracking two objects and want to save a frame when they are within 100 of each other. Im measuring the distance using:

bool bSavePic = false;

void example{
    int x1,y1,x2,y2;
int distance; //distance between two objects

if(initialMarkers.size()>1){
x1 = initialMarkers.at(0).getXPos();
y1 = initialMarkers.at(0).getYPos();
x2 = initialMarkers.at(1).getXPos();
y2 = initialMarkers.at(1).getYPos();

distance = (int)sqrt((double)((x2-x1)*(x2-x1) + (y2-y1)*(y2-y1)));

cv::putText(cameraFeed,intToString(distance),cv::Point(50,50),1,1,Scalar(255,0,0));

  if (distance < 100 )
        {
            bSavePic= true;
            }else{
            bSavePic= false;
        }
     }

The problem I'm having is when they are within 100 of each other the following code outputs the video stream, then saves the frame when the markers distance is greater than 100 again.

if (bSavePic == true)
        {
            putText(cameraFeed,"Saving Image",Point(50,70),1,1,Scalar(0,0,255),1);
            waitKey(10);
            capture >> saveImage;
        }

    char buffer[1000];
    for(int c=0; c<1; c++)
        {
            sprintf(buffer,"C:\\Users\\Scott\\Documents\\Visual Studio 2010\\Projects\\MultipleObjectTracking\\Image-%d.jpg",c);
            imwrite(buffer, saveImage);             
        }

    if(!saveImage.empty())
        {
            Mat readImage;
            readImage = imread(buffer,CV_LOAD_IMAGE_COLOR);
            imshow(windowName4, readImage);
        }

Any advice on how to save the first frame as soon the distance is less than 100 and only save another when the distance goes outside 100 and back within the range?

Note c<1 because it was saving every frame while the distance was less than 100.

War es hilfreich?

Lösung

I solved this using

bool bSingleFrame = true;

 int main{

        if (bSavePic == true)//distance<100
    {

        if (bSingleFrame == true)
        {
        putText(cameraFeed,"Saving Image",Point(50,70),1,1,Scalar(0,0,255),1);
        Mat saveImage;
        capture >> saveImage;
            stringstream ssFileName;                    //string stream initialised through each passing of while loop
            ssFileName << "Image-" << c << ".jpg";      //File name based on frame captured 0++
            ssFileName >> sFileName;


        if(!saveImage.empty())                          //check if frame captured is stored in matrix
        {
            cout << "Frame captured." << endl;          //if data in frame cout
            imwrite(sFileName.c_str(), saveImage);      //save frame
            saveImage.release();                        
            c++;
            if (bSavePic == true)                       //if distance still <100
            {
                bSingleFrame = false;
            }

            Mat readImage;
            readImage = imread(sFileName.c_str(),CV_LOAD_IMAGE_COLOR);  
            imshow(windowName4, readImage);             //show captured frame in new window
        }else{
            cout << "Error, could not capture frame to save." << endl;
        }//if(!saveImage.empty())
        }//bSingleFrame
    }//ifbSavePic

    if (bSavePic == false)
            {
                bSingleFrame = true;//if distance back >100 can capture another frame
                }
}

Note this is only a snippet. But it does what was needed.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top