C++ 如何创建对象数组并访问子类中的函数?c++;
要同时捕获图像,我想创建一个对象数组(C++ 如何创建对象数组并访问子类中的函数?c++;,c++,class,C++,Class,要同时捕获图像,我想创建一个对象数组(cam)。使用当前阵列,我可以执行类xiAPIplus\u摄像头的功能,但类xiAPIplus\u摄像头内的功能不会启动。 e、 g:如果我启动cv::Mat GetNextImageOcvMat()改为运行类析构函数 class xiAPIplusCameraOcv : public xiAPIplus_Camera { public: /** * Initialize the xiAPIplusCameraOcv class. *
cam
)。使用当前阵列,我可以执行类xiAPIplus\u摄像头
的功能,但类xiAPIplus\u摄像头
内的功能不会启动。
e、 g:如果我启动cv::Mat GetNextImageOcvMat()代码>改为运行类析构函数
class xiAPIplusCameraOcv : public xiAPIplus_Camera
{
public:
/**
* Initialize the xiAPIplusCameraOcv class.
*/
xiAPIplusCameraOcv();
/**
* Class destructor. Free allocated memory, release images
*/
virtual ~xiAPIplusCameraOcv();
/**
* Reads an image from the camera using XiAPI, stores the image in OpenCV Mat format.
* @return OpenCV Mat image.
*/
cv::Mat GetNextImageOcvMat(); //Reads an image and converts it to OpenCV Mat
/**
* Converts a XiAPI image (xiAPIplus_Image*) to OpenCV Mat.
* @param input_image[in] Input xiAPIplus_Image* to be converted.
* @return converted OpenCV IpliImage* image.
*/
cv::Mat ConvertOcvMat(xiAPIplus_Image * input_image); //Converts an image to OpenCV Mat
//virtual xiAPIplusCameraOcv& operator >> (CV_OUT Mat& input_image);
private:
/**
* Resets the Opencv image if properties of XI_IMG have changed. Resets the cv_mat_image_.
*/
void resetCvImage_(); //Resets the OpenCV image properties if XI_IMG format has changed
cv::Mat cv_mat_image_;
xiAPIplus_Image * next_image_;
int timeout_;
int counter_;
int index_;
};
主函数能够创建数组,但我在使用它时遗漏了一些东西
int main(int argc, char* argv[])
{
try
{
xiAPIplusCameraOcv cam[5];
int n = cam[4].GetNumberOfConnectedCameras();
int uidArray[4];
char* snArray[4];
for (int id = 0; id < n; id++)
{
printf("Opening %d. camera ...\n", id + 1);
cam[id].OpenByID(id);
cam[id].GetSerialNumber(sn, 100);
}
for (int exp = 0; exp < n; exp++)
{
cam[exp].StartAcquisition();
Mat cv_mat_image = cam[exp].GetNextImageOcvMat(); //
printf("GetNextImageOcvMat\n");
cv::imwrite(save_at, cv_mat_image);// , compression_params);
cam[exp].StopAcquisition();
}
printf("Done\n");
cv::waitKey(500);
}
catch (xiAPIplus_Exception& exp)
{
printf("Error:\n");
exp.PrintError();
#ifdef WIN32
Sleep(2000);
#endif
cv::waitKey(2000);
return -1;
}
return 0;
}
你的索引正确吗?您创建了一个由5个“摄影机”组成的阵列。然后,根据从第四个“摄影机”上的某个方法提取的“n”在该阵列上循环。您正在使用“exp”,这并不违法,但不会使代码更易于阅读。如果没有正确地索引到cam[]中,则可能(取决于“xiAPIplus_Exception”的定义)引发异常,从而在catch()块中结束,此时cam[]数组超出范围,并调用每个项的析构函数。也许把“XIAPPLUSCAMERAOCV cam[5];”行放在try/catch块之外?很有帮助,我没有注意到我重复使用了“exp”。但正如你所说,这并没有导致错误。xiAPIplus_异常引发,它没有改变将“xiAPIplusCameraOcv cam[5];”放在我的try/catch区块之外的问题:您认为“n”设置为什么?这行代码:Mat cv_Mat_image=cam[exp].GetNextImageOcvMat();抛出捕获的异常?如果是这样的话,那么在实现代码的某个地方就有问题了(我们看不到)。n被设置为4。好吧,如果是这样的话,我会试着自己找出答案,因为我不想在这里发布这么多代码。如果有人想看:
/**
* Class destructor. Free allocated memory, release images
*/
xiAPIplusCameraOcv::~xiAPIplusCameraOcv(){
printf("Closing xiAPIplus_Ocv camera\n");
cv_mat_image_.release();
}