Frame::Frame(const cv::Mat &imGray, const cv::Mat &imDepth, const double &timeStamp, ORBextractor* extractor,ORBVocabulary* voc, cv::Mat &K, cv::Mat &distCoef, const float &bf, const float &thDepth) :mpORBvocabulary(voc),mpORBextractorLeft(extractor),mpORBextractorRight(static_cast<ORBextractor*>(NULL)), mTimeStamp(timeStamp), mK(K.clone()),mDistCoef(distCoef.clone()), mbf(bf), mThDepth(thDepth) { // Frame ID mnId=nNextId++; // Scale Level Info mnScaleLevels = mpORBextractorLeft->GetLevels(); mfScaleFactor = mpORBextractorLeft->GetScaleFactor(); mfLogScaleFactor = log(mfScaleFactor); mvScaleFactors = mpORBextractorLeft->GetScaleFactors(); mvInvScaleFactors = mpORBextractorLeft->GetInverseScaleFactors(); mvLevelSigma2 = mpORBextractorLeft->GetScaleSigmaSquares(); mvInvLevelSigma2 = mpORBextractorLeft->GetInverseScaleSigmaSquares(); // ORB extraction ExtractORB(0,imGray); N = mvKeys.size(); if(mvKeys.empty()) { return;} /* UndistortKeyPoints(); ComputeStereoFromRGBD(imDepth); mvpMapPoints = vector<MapPoint*>(N,static_cast<MapPoint*>(NULL)); mvbOutlier = vector<bool>(N,false); // This is done only for the first Frame (or after a change in the calibration) if(mbInitialComputations) { ComputeImageBounds(imGray); mfGridElementWidthInv=static_cast<float>(FRAME_GRID_COLS)/static_cast<float>(mnMaxX-mnMinX); mfGridElementHeightInv=static_cast<float>(FRAME_GRID_ROWS)/static_cast<float>(mnMaxY-mnMinY); fx = K.at<float>(0,0); fy = K.at<float>(1,1); cx = K.at<float>(0,2); cy = K.at<float>(1,2); invfx = 1.0f/fx; invfy = 1.0f/fy; mbInitialComputations=false; } mb = mbf/fx; AssignFeaturesToGrid(); */ }
时间: 2024-04-03 22:35:22 浏览: 66
这是一个名为 Frame 的构造函数,用于初始化帧对象。该函数接收一些参数,包括灰度图像、深度图像、时间戳、ORB 特征提取器、ORB 词汇表、相机内参矩阵、畸变系数、基线和深度阈值等。在函数中,它会进行一些计算和操作,包括提取 ORB 特征、计算尺度信息、去畸变、计算立体匹配、计算图像边界、将特征点分配到网格等。其中一些计算只在第一帧或相机内参发生变化时进行。
相关问题
const newImageBitmap = canvas.transferToImageBitmap(); const newFrame = new VideoFrame(newImageBitmap, { timestamp:timestamp, displayHeight:imageHeight, displayWidth:imageWidth }); 为什么会报错
这段代码中使用了VideoFrame API,该API是实验性的,目前只有Chrome浏览器支持,其他浏览器可能不支持。因此,如果你在非Chrome浏览器中运行该代码,就会报错。
另外,该代码中也存在一些潜在的问题,需要注意:
1. canvas.transferToImageBitmap()方法也是实验性的,目前只有Chrome浏览器支持,其他浏览器可能不支持。因此,如果你在非Chrome浏览器中运行该代码,也会报错。
2. VideoFrame API的使用需要在安全上下文(Secure Context)中进行,即必须在HTTPS环境下才能使用,否则也会报错。
3. VideoFrame构造函数需要传入一个VideoFrameInit对象作为参数,其中包含了一些必填的属性,如timestamp、displayHeight和displayWidth。如果这些属性没有正确设置,也会导致代码报错。
因此,如果要使用VideoFrame API,需要在Chrome浏览器中,并且在HTTPS环境下,同时需要确保代码正确设置了VideoFrameInit对象中的所有必填属性。
std::vector<base::ObjectPtr> radar_objects; if (!radar_perception_->Perceive(corrected_obstacles, options, &radar_objects)) { out_message->error_code_ = apollo::common::ErrorCode::PERCEPTION_ERROR_PROCESS; AERROR << "RadarDetector Proc failed."; return true; } out_message->frame_.reset(new base::Frame()); out_message->frame_->sensor_info = radar_info_; out_message->frame_->timestamp = timestamp; out_message->frame_->sensor2world_pose = radar_trans; out_message->frame_->objects = radar_objects; for (auto object_ptr : radar_objects) { object_ptr->local_center = radar2novatel_trans * radar_trans.inverse()* object_ptr->center; AINFO << "Local center point: " << object_ptr->local_center.transpose(); } return true; const double end_timestamp = Clock::NowInSeconds(); const double end_latency = (end_timestamp - in_message->header().timestamp_sec()) * 1e3; AINFO << "FRAME_STATISTICS:Radar:End:msg_time[" << in_message->header().timestamp_sec() << "]:cur_time[" << end_timestamp << "]:cur_latency[" << end_latency << "]"; PERF_BLOCK_END_WITH_INDICATOR(radar_info_.name, "radar_perception"); return true; }
这段代码是一个函数,它处理雷达感知的结果。首先,它将感知到的障碍物数据存储在一个名为radar_objects的vector中。
然后,它创建一个新的base::Frame对象,并将雷达传感器的信息、时间戳、传感器到世界坐标系的变换矩阵和雷达障碍物数据保存在该对象中。
接下来,通过对radar_objects中的每个对象进行循环遍历,计算每个对象的本地中心点坐标,并将结果保存在对象的local_center属性中。
最后,计算处理完成的时间戳和延迟,并输出相关的日志信息。
函数最后返回true表示处理成功。
阅读全文