2016-08-09 7 views
0

Mein Programm dient zur Objektverfolgung. Ich könnte Objektverfolgung und bieten Objekte x, y mit Koordinaten nach Momenten Methode.Pixelkoordinate in Weltkoordinate in OpenCv2 umwandeln

enter image description here

enter image description here

Ich möchte Pixel in Welt in OpenCV2 Koordinaten konvertieren. Ich habe bereits Drehungsmatrix (3 * 3) und Übersetzungsvektor (3 * 1) durch Kamerakalibrierung und ich kenne Brennweite meiner Kamera.

Nun habe ich wie folgt definiert.

CvMat *rotation = (CvMat*)cvLord("Rotation.xml") 
CvMat *translation = (CvMat*)cvLord("Translation.xml") 

Und das ist der Teil meines Programms.

void trackFilteredObject(Mat threshold,Mat HSV, Mat &Birds_image){ 

    vector <Fruit> apples; 

    Mat temp; 
    threshold.copyTo(temp); 

    // these two vectors needed for output of findContours 
    vector< vector<Point> > contours; 
    vector<Vec4i> hierarchy; 

    // find contours of filtered image using OpenCv findCountours function 
    findContours(temp,contours,hierarchy,CV_RETR_CCOMP,CV_CHAIN_APPROX_SIMPLE); 

    // use moments method to find our filtered object. 
    double refArea = 0; 
    bool objectFound = false; 
    if (hierarchy.size() > 0) { 
    int numObjects = hierarchy.size(); 

    // if number of objects greater than MAX_NUM_OBJECTS, we have a noisy filter. 
    if(numObjects<MAX_NUM_OBJECTS){ 
     for (int index = 0; index >= 0; index = hierarchy[index][0]) { 
      Moments moment = moments((cv::Mat)contours[index]); 
      double area = moment.m00; 

      if(area>MIN_OBJECT_AREA){ 
       Fruit apple; 

       // moments method 
       apple.setXPos(moment.m10/area); 
       apple.setYPos(moment.m01/area); 
       apples.push_back(apple); 

       objectFound = true; 

      }else objectFound = false; 
     } 
     if(objectFound ==true){ 
      // draw object location on screen 
      drawObject(apples,Birds_image); 
     } 
    }else putText(Birds_image,"TOO MUCH NOISE! ADJUST FILTER",Point(0,50),1,2,Scalar(0,0,255),2); 
    } 
} 

Und drawObject (Äpfel, Birds_image) ist dies.

void drawObject(vector<Fruit> theFruits,Mat &frame){ 
    for(int i =0; i<theFruits.size(); i++){ 
    cv::circle(frame,cv::Point(theFruits.at(i).getXPos(),theFruits.at(i).getYPos()),10,cv::Scalar(0,0,255)); 
    cv::putText(frame,intToString(theFruits.at(i).getXPos())+ " , " + intToString(theFruits.at(i).getYPos()),cv::Point(theFruits.at(i).getXPos(),theFruits.at(i).getYPos()+20),1,1,Scalar(0,255,0)); 
    } 
} 

Und ich benutze diese Souse-Datei und Header-Datei.

Fruit.h

#pragma once 
#include <string> 
using namespace std; 

class Fruit 
{ 
public: 
Fruit(void); 
~Fruit(void); 

int getXPos(); 
void setXPos(int x); 


int getYPos(); 
void setYPos(int y); 

private: 

int xPos, yPos; 
string type; 

}; 

Fruit.cpp

#include "Fruit.h" 


Fruit::Fruit(void) 
{ 
} 


Fruit::~Fruit(void) 
{ 
} 

int Fruit::getXPos(){ 
return Fruit::xPos; 
} 

void Fruit::setXPos(int x){ 
Fruit::xPos = x; 
xPos = x; 
} 

int Fruit::getYPos(){ 
return Fruit::yPos; 
} 

void Fruit::setYPos(int y){ 
Fruit::yPos = y; 
yPos = y; 
} 

Können Sie mir Ihre herrlichen Ideen.

+0

Die Rotationsmatrix und der Translationsvektor, die durch den Kamerakalibrierungsprozess geschätzt wurden, stellen die Transformation zwischen dem Schachbrettrahmen und dem Kamerarahmen für das entsprechende Bild dar. Wenn Sie ein einzelnes Bild und ein beliebiges Objekt verwenden, können Sie die 3D-Koordinate nicht wiederherstellen. Wenn Sie die tatsächliche Objektgröße kennen, sollten Sie grob die 3D-Koordinaten schätzen können. – Catree

Antwort

0

Sehen Sie sich die Funktion findHomography in opencv an. Es hilft, die Transformation von einer Ebene zur anderen zu finden, aber nur die 2D-Koordinaten können gefunden werden.
Diese Verknüpfung bietet ein ähnliches Beispiel für die Konvertierung der Koordinaten von der Bildebene in die Objektebene. (Camera pixels to planar world points given 4 known points)

+0

danke. Ich habe dieses Problem gelöst. –