我在我的项目中使用Pylon SDK。它是Basler相机的SDK。
我在gimbalControl
函数的无限循环中调用main
函数。
在gimbalControl
中,我需要定义变量并初始化万向节部分。之后,我在函数的其余部分使用那些初始化和定义的东西。以下是我的代码澄清问题的示例。
void gimbalControl(void)
{
try
{
// Only executed in the first iteration
if(!gimbalInitialized)
{
setupGimbal();
configConnection();
PylonInitialize();
// Create an instant camera object with the camera device found first.
CInstantCamera camera(CTlFactory::GetInstance().CreateFirstDevice());
// Open the camera before accessing any parameters
camera.Open();
// Start the grabbing of images
camera.StartGrabbing();
gimbalInitialized = true;
}
else
{
// Wait for an image and then retrieve it. A timout of 5000 ms is used.
camera.RetrieveResult(5000, ptrGrabResult, TimeoutHandling_ThrowException); // CAUSES ERROR
// Image not grabbed successfully?
if (!ptrGrabResult->GrabSucceeded())
{
cout << "Cannot capture a frame from video stream" << endl;
}
}
catch(...) // Catch all unhandled exceptions
{
printf("ERROR IN CAMERA CONNECTION\n");
}
}
我试图让这个模块基于类,但我不知道如何在类中声明相机以便稍后在对象中使用。实际上,我不知道这种camera
声明是什么!
编译此代码时出现错误camera was not declared in this scope
。
问题1 :如何在此无限循环中定义一次相机而不会引发此错误?
问题2 :如何在类中声明camera
作为私有变量?
答案 0 :(得分:2)
一种方法是在camera
块之外使try
静态:
static CInstantCamera camera(CTlFactory::GetInstance().CreateFirstDevice());
try {
...
} catch (...) {
...
}
这可以确保camera
对象只初始化一次,并且可以在条件中else
的两边保持可访问状态。
要在班级中声明camera
,请将CTlFactory::GetInstance().CreateFirstDevice()
放入初始化列表中:
class MyClass {
private:
CInstantCamera camera;
public:
MyClass() : camera(CTlFactory::GetInstance().CreateFirstDevice()) {
}
};
答案 1 :(得分:2)
camera
只是一个常规初始化。在这种情况下,您只需调用CInstantCamera
上的构造函数,该构造函数采用任何类型CTlFactory::GetInstance().CreateFirstDevice()
作为唯一参数。
所有意图和目的的范围定义了对象的生命周期。除非它们共享父范围,否则一个对象不能在另一个范围内与另一个对象进行实际对话。在这种情况下,camera
在第一个if
条件块范围的范围内定义,但您在else
条件块范围内引用它。
void gimbalControl(void)
{
// scope #1
try
{
// scope #2 (inherits #1)
if(!gimbalInitialized)
{
// scope #3 (inherits #1, #2)
}
else
{
// scope #4 (inherits #1, #2)
}
}
catch(...)
{
// scope #5 (inherits #1)
}
}
请注意范围 4 仅继承 1 和 2 ,而不是 3 ?它们处于相同的父级范围内,因此它们的生命周期不同。在这些范围内,对象不能(合理地)相互通信。
解决方案是在范围 2 中初始化camera
。由于您是在循环中调用它,因此您需要生成声明static
,以便它不会在每次调用期间构建,只是第一个。
参考文献 - Scope,Storage Duration - 请参阅: static
答案 2 :(得分:1)
简单地说,如果你的主要在一个循环中调用gimbalControl(),你必须声明你想要只有一次在gimbalControl之外的变量。在循环之前在main中执行:
int main(){
int myVar=0; //only declareded once
while(true){
gimbalControl();
}
}
或将它们声明为全局变量。如果你在gimbalControl中声明它并多次调用gimballControl,那么每次调用gimbalControll它都会对它进行delcare。