/*---------------------------- * 功能 : 检测近距目标,输出目标信息序列 *---------------------------- * 函数 : PointCloudAnalyzer::detectNearObject * 访问 : public * 返回 : void * * 参数 : image [io] 左摄像机视图,会进行原位操作,绘制目标尺寸位置 * 参数 : pointCloud [in] 三维点云 * 参数 : objectInfos [out] 目标信息序列 */ void PointCloudAnalyzer::detectNearObject(cv::Mat& image, cv::Mat& pointCloud, vector<ObjectInfo>& objectInfos) { if (image.empty() || pointCloud.empty()) { return; } // 提取深度图像 vector<cv::Mat> xyzSet; split(pointCloud, xyzSet); cv::Mat depth; xyzSet[2].copyTo(depth); // 根据深度阈值进行二值化处理 double maxVal = 0, minVal = 0; cv::Mat depthThresh = cv::Mat::zeros(depth.rows, depth.cols, CV_8UC1); cv::minMaxLoc(depth, &minVal, &maxVal); double thrVal = minVal * 1.5; threshold(depth, depthThresh, thrVal, 255, CV_THRESH_BINARY_INV); depthThresh.convertTo(depthThresh, CV_8UC1); imageDenoising(depthThresh, 3); // 获取离摄像头较近的物体信息 parseCandidates(depthThresh, depth, objectInfos); // 绘制物体分布 showObjectInfo(objectInfos, image); return; }
/*---------------------------- * 功能 : 检测近距目标,输出目标信息序列 *---------------------------- * 函数 : PointCloudAnalyzer::detectNearObject * 访问 : public * 返回 : void * * 参数 : image [io] 左摄像机视图,会进行原位操作,绘制目标尺寸位置 * 参数 : pointCloud [in] 三维点云 * 参数 : objectInfos [out] 目标信息序列 */ void PointCloudAnalyzer::detectNearObject(cv::Mat& image, cv::Mat& pointCloud, vector<ObjectInfo>& objectInfos) { if (image.empty() || pointCloud.empty()) { return; } // 提取深度图像 vector<cv::Mat> xyzSet; split(pointCloud, xyzSet); cv::Mat depth; xyzSet[2].copyTo(depth); // 根据深度阈值进行二值化处理 double maxVal = 0, minVal = 0; cv::Mat depthThresh = cv::Mat::zeros(depth.rows, depth.cols, CV_8UC1); cv::minMaxLoc(depth, &minVal, &maxVal);//找到depth中的最小值和最大值 threshold(depth, depthThresh, 125, 255, CV_THRESH_BINARY_INV);// "http://baike.baidu.com/view/3586026.htm" // threshold(depth, depthThresh,80, 255, CV_THRESH_BINARY_INV); depthThresh.convertTo(depthThresh, CV_8UC1); imageDenoising(depthThresh, 3); // Mat img_gray,img_gray_out; // cvtColor( image, img_gray, CV_BGR2GRAY ); // threshold(img_gray, img_gray_out, 100, 255, CV_THRESH_BINARY); // imageDenoising(img_gray, 3); // blur( img_gray, img_gray, Size(3,3) ); // cv::namedWindow("lslsls",1); // imshow("lslsls",img_gray); // blur( img_gray, img_gray, Size(3,3) ); parseCandidates(depthThresh, depth, objectInfos); // parseCandidates(img_gray, depth, objectInfos); if(depthThresh.empty()) AfxMessageBox(_T("object为空@@@@")); // 获取离摄像头较近的物体信息 /* cvNamedWindow("lslsls",CV_WINDOW_AUTOSIZE); imshow("lslsls",depth); cvWaitKey(0); cvDestroyWindow("lslsls");*/ if(objectInfos.empty()) AfxMessageBox(_T("objectInfos为空")); // 绘制物体分布 showObjectInfo(objectInfos, image); }