关于实时扫描重建的一些问题请教
关于实时扫描重建的一些问题请教
博主您好!在测试完单目及双目的标定及单次重建流程后,我们选择尝试高速的实时重建(单目结构光方式),但都失败了。在这个过程中有以下疑问,想要向您请教:
我们的环境为:
- VS2022+OpenCV4.8+CUDA12.0
- 显卡为1650Ti
- 华睿相机+4710光机(白光)
- OpenCV勾选CUDA之后进行了编译,且编译没有报错,如下所示:
-
问题一:没有本地编译CUDA生成的exe程序是否支持实时重建呢? 我们使用您发布的程序将光机的投图周期刻意降低,但是实时重建时程序闪退。
-
问题二:随后,我们使用编译CUDA的exe程序尝试实时重建也失败了。在第一帧点云展示后,程序闪退。 我们对持续扫描函数进行了一些修改增加了log的输出,发现第一帧扫描完成,进行第二组图片的回调、取图的时候,程序退出。我们判断是buffer溢出导致进程卡死退出的,不知道是不是正确的推测呢?如果不是该处存在的问题,还请您帮忙进行分析推断问题所在,感谢!
`bool MonocularCamera::continuesCapture(SafeQueue<FrameData> &frameDataQueue) {
if (!isCaptureStop_.load(std::memory_order_acquire)) {
return true;
}
if (imgCreateThread_.joinable()) {
imgCreateThread_.join();
}
if (frameDataCreateThread_.joinable()) {
frameDataCreateThread_.join();
}
isCaptureStop_.store(false, std::memory_order_release);
imgCreateThread_ = std::thread([&] {
const device::CameraFactory::CameraManufactor manufator =
stringProperties_["2D Camera Manufactor"] == "Huaray"
? device::CameraFactory::Huaray
: device::CameraFactory::Halcon;
auto pLeftCamera = cameraFactory_.getCamera(
stringProperties_["Left Camera Name"], manufator);
device::Camera *pColorCamera = nullptr;
if (stringProperties_["Color Camera Name"] != "") {
pColorCamera = cameraFactory_.getCamera(
stringProperties_["Color Camera Name"], manufator);
}
const int imgSizeWaitFor = numbericalProperties_["Total Fringes"];
while (!isCaptureStop_.load(std::memory_order_acquire)) {
if (pLeftCamera->getImgs().size() >= imgSizeWaitFor &&
(pColorCamera ? pColorCamera->getImgs().size() >= imgSizeWaitFor
: true)) {
std::vector<std::vector<cv::Mat>> imgs(pColorCamera ? 2 : 1);
int index = 0;
while (index != imgSizeWaitFor) {
imgs[0].emplace_back(pLeftCamera->popImg());
if (pColorCamera) {
imgs[1].emplace_back(pColorCamera->popImg());
}
++index;
//add by Jia
std::cout << "imgCreateThread : pLeftCamera->getImgs().size() = " << pLeftCamera->getImgs().size() << std::endl;
}
std::cout << "imgCreateThread : Before : imgsCreated_.size() = " << imgsCreated_.size() << std::endl;
if (imgsCreated_.size() > 2) {
continue;
}
imgsCreated_.push(imgs);
std::cout << "imgCreateThread : After : imgsCreated_.size() = " << imgsCreated_.size() << std::endl;
}
}
});
frameDataCreateThread_ = std::thread([&] {
while (!isCaptureStop_.load(std::memory_order_acquire)) {
if (imgsCreated_.empty()) {
std::this_thread::sleep_for(std::chrono::milliseconds(5));
continue;
}
std::cout << "frameDataCreateThread : Before : imgsCreated_.size() = " << imgsCreated_.size() << std::endl;
std::vector<std::vector<cv::Mat>> imgs;
imgsCreated_.move_pop(imgs);
std::cout << "frameDataCreateThread : After : imgsCreated_.size() = " << imgsCreated_.size() << std::endl;
std::cout << "frameDataCreateThread : After : imgs.size() = " << imgs.size() << std::endl;
if (stringProperties_["Color Camera Name"] != "") {
for (int i = 0; i < imgs.size(); ++i) {
cv::cvtColor(imgs[i], imgs[i], cv::COLOR_BayerBG2BGR);
}
}
FrameData curFrameData;
decode(imgs, curFrameData);
//frameDataQueue.push(curFrameData);
}
});
projectorFactory_.getProjector(stringProperties_["DLP Evm"])->project(true);
return true;
}`
- 问题三:我们如果想要跑通实时重建的流程的话,需要注意哪些细节呢?比如编解码的方式、pattern的数量、硬件设置(相机及光机的周期设置)等一些方面?
期待您的回复,感谢!!!!!
博主您好!经过几天的探究,我们对实时重建出现的问题有了一些新的发现,但目前没有找到最合适的解决办法,现向您请教!
- 问题描述:我们重点关注了continuesCapture函数,发现您设置了imgCreateThread_、frameDataCreateThread_这几个线程,分别负责取图以及解码进行点云展示。在frameDataCreateThread_线程的最后,创建了curFrameData的结构体负责存储解码生成的点云相关数据。如下所示:
我们做了以下尝试:
-
将几个线程隔离开进行测试,发现问题出现在frameDataCreateThread_线程。
-
进而对该线程进行排查,将FrameData curFrameData设置为全局变量,发现软件崩溃退出的问题得到了解决。但是该种方式失去了数据保护的优势。是否有其他的一些方式可以采用?
-
对FrameData结构体进行了查看,发现每次调用该结构体都会分配新的地址,但在线程调用后却没有释放,不知道此处是否存在一些问题?