Première question ici! Donc, j'ai quelques problèmes avec les pointeurs dans Visual C++ 2008. J'écris un programme qui va contrôler six caméras et faire un peu de traitement sur eux afin de nettoyer les choses J'ai créé une classe Camera Manager. Cette classe gère toutes les opérations qui seront effectuées sur toutes les caméras. Ci-dessous, une classe Camera qui interagit avec chaque pilote de caméra et effectue un traitement d'image de base. Maintenant, l'idée est que lorsque le gestionnaire est initialisé, il crée deux caméras et les ajoute à un vecteur afin que je puisse y accéder plus tard. Le problème ici est que lorsque je crée la seconde caméra (camera2), le destructeur de la première caméra est appelé pour une raison quelconque, ce qui déconnecte alors la caméra.La création d'un nouvel objet détruit un objet plus ancien avec un nom différent en C++
Normalement, je suppose que le problème est quelque part dans la classe Camera, mais dans ce cas tout fonctionne parfaitement tant que je ne crée pas l'objet camera2.
Qu'est-ce qui ne va pas?
CameraManager.h:
#include "stdafx.h"
#include <vector>
#include "Camera.h"
class CameraManager{
std::vector<Camera> cameras;
public:
CameraManager();
~CameraManager();
void CaptureAll();
void ShowAll();
};
CameraManager.cpp:
#include "stdafx.h"
#include "CameraManager.h"
CameraManager::CameraManager()
{
printf("Camera Manager: Initializing\n");
[...]
Camera *camera1 = new Camera(NodeInfo,1, -44,0,0);
cameras.push_back(*camera1);
// Adding the following two lines causes camera1's destructor to be called. Why?
Camera *camera2 = new Camera(NodeInfo,0, 44,0,0);
cameras.push_back(*camera2);
printf("Camera Manager: Ready\n");
}
Camera.h
#include "stdafx.h"
// OpenCV
#include <cv.h>
#include <highgui.h>
// cvBlob
#include "cvblob.h"
// FirePackage
#include <fgcamera.h>
using namespace cvb;
class Camera{
public:
int cameraID;
double x, y,z, FOVx, FOVy;
IplImage *image, *backgroundImage, *labeledImage;
CvBlobs blobs;
Camera(FGNODEINFO NodeInfo[], int camID, float xin, float yin, float zin);
~Camera();
void QueryFrame();
void ProcessFrame();
void GrabBackground();
void LoadCalibration();
void Show();
private:
// ======= FirePackage ======
CFGCamera FGCamera;
UINT32 Result;
FGNODEINFO MyNodeInfo;
UINT32 NodeCnt;
FGFRAME Frame;
// ======= Camera Configuration ======
// Trigger Settings
UINT32 nOn, nPolarity, nSrc, nMode, nParm, BurstCount, DMAMode;
// Image Settings
UINT32 AutoExposure, Shutter, Gain, Brightness, Gamma;
// Image Format Settings
UINT32 Format, Mode, Resolution, ColorFormat, FrameRate;
// Structures
UINT32 TriggerValue;
UINT32 FormatValue;
UINT32 DFormatValue;
// OpenCV Calibration matrices
CvMat *intrinsics, *distortion;
IplImage *mapx, *mapy;
void SetUpFirePackage();
void SetUpOpenCV();
};
Camera.cpp:
#include "stdafx.h"
#include "Camera.h"
Camera::Camera(FGNODEINFO NodeInfo[], int camID, float xin, float yin, float zin)
{
cameraID = camID;
x = xin;
y = yin;
z = zin;
FOVx = 42.6;
FOVy = 32.5;
MyNodeInfo = NodeInfo[cameraID];
SetUpFirePackage();
SetUpOpenCV();
// Grab the first frame
printf("Waiting for frame...\n");
QueryFrame();
};
//Destructor
Camera::~Camera()
{
// Stop the device
FGCamera.StopDevice();
// Close capture
FGCamera.CloseCapture();
// Disconnect before ExitModule
FGCamera.Disconnect();
// Exit module
FGExitModule();
cvReleaseImage(&image);
};
[...]
};
Qu'est-ce qui vous fait penser que camera1 est détruite? Il ne devrait pas être, basé sur ce code –
En passant par le code montre que, après la création de camera2 l'exécution va dans Camera :: ~ Camera qui arrête la connexion avec la caméra physique, puis détruit l'objet. La vérification de l'ID de cette caméra montre qu'il s'agit de camera1. – Mikael