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
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.
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