opencv数据类型和格式的坑

//cv::Mat uvp = cv::Mat::zeros(2, probp.size(), CV_8UC1);
cv::Mat uvp = cv::Mat::zeros(2, probp.size(), CV_64FC1);//data-type...
for (unsigned int i = 0; i <probp.size(); i++ )
{
uvp.at<float>(0, i) = probp[i].x;
uvp.at<float>(1, i) = probp[i].y;
}
cv::Mat ipmps, xyp;
imagetoground(uvp, xyp, h, roll, pitch, camera_param_KK);

		//cv::Mat uvp = cv::Mat::zeros(2, probp.size(), CV_8UC1);
        cv::Mat uvp = cv::Mat::zeros(2, probp.size(), CV_64FC1);//data-type...
		for (unsigned int i = 0; i <probp.size(); i++ )
		{
			uvp.at<float>(0, i) = probp[i].x;
			uvp.at<float>(1, i) = probp[i].y;
		}
		cv::Mat ipmps, xyp;
		imagetoground(uvp, xyp, h, roll, pitch, camera_param_KK);

  

//imagetoground...
void imagetoground(cv::Mat& uv,  cv::Mat& xy, double ht, double roll, double pitch, double* camera_param_KK)
{ 
	std::cout << "111" << std::endl;
	int height = (int)(ht*1000); //unit-mm.
	double fx = camera_param_KK[0];
	double fy = camera_param_KK[4];
    double cx = camera_param_KK[2]; 
	double cy = camera_param_KK[5]; 
	
	double c1 = cos(pitch*PI / 180);
	double s1 = sin(pitch*PI / 180);
	double c2 = cos(roll*PI / 180);
	double s2 = sin(roll*PI / 180);
     
	cv::Mat Tf = (cv::Mat_<double>(3, 3) << fx, 0, cx,
		 0, fy, cy,
		 0, 0, 1);
   
	cv::Mat Tx = (cv::Mat_<double>(3, 3) << 1, 0, 0,
		 0, c1, s1,
		 0, -s1, c1);
    
    cv::Mat T = Tx.inv() * Tf.inv(); 	
	T.rowRange(0, 2) = T.rowRange(0, 2)*(-height);	
	cv::Mat temp = cv::Mat::ones(3, uv.cols, CV_64FC1);	
	
	uv.copyTo(temp.rowRange(0, 2) ) ;	
	cv::Mat xyt = T*temp;
	xyt.rowRange(0, 1) = xyt.rowRange(0, 1) / xyt.rowRange(2, 3);
	xyt.rowRange(1, 2) = xyt.rowRange(1, 2) / xyt.rowRange(2, 3);

	xyt.rowRange(0, 2).copyTo(xy);//deep-copy...
}

注意 

错误的描述一般是内存冲突memory crruption,abort等等...

原文地址:https://www.cnblogs.com/happyamyhope/p/8984368.html