/*----------------------------
 * 功能 : 检测近距目标,输出目标信息序列
 *----------------------------
 * 函数 : 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);
}