当前位置: 首页>>代码示例>>C++>>正文


C++ Mat::cross方法代码示例

本文整理汇总了C++中Mat::cross方法的典型用法代码示例。如果您正苦于以下问题:C++ Mat::cross方法的具体用法?C++ Mat::cross怎么用?C++ Mat::cross使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Mat的用法示例。


在下文中一共展示了Mat::cross方法的12个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: isQuadValid

bool isQuadValid(const vector< Point_<T> >& quad) {

	if(quad.size() != 4) return false;
	
	Mat quadMat;
	for(size_t i = 0; i < 4; i++) {
		Mat Z = (Mat_<double>(1,3) << quad[i].x, quad[i].y, 0 );
		if(quadMat.empty()){
			quadMat = Z;
		}
		else{
			quadMat.push_back( Z );
		}
	}
	
	Mat A = quadMat.row(0)-quadMat.row(1);
	Mat B = quadMat.row(2)-quadMat.row(1);
	Mat C = quadMat.row(0)-quadMat.row(2);
	Mat D = quadMat.row(3)-quadMat.row(2);
	Mat E = quadMat.row(3)-quadMat.row(1);
	
	int sign = -1;
	if(A.cross(B).at<double>(0, 2) > 0){
		sign = 1;
	}
	
	return	sign*E.cross(B).at<double>(0, 2) > 0 &&
			sign*C.cross(D).at<double>(0, 2) > 0 &&
			sign*A.cross(E).at<double>(0, 2) > 0;
}
开发者ID:Zain-Ul-Hasanaat,项目名称:scan,代码行数:30,代码来源:AlignmentUtils.cpp

示例2: rotation_matrix

//Function for calculating Rotation Matrix
Mat rotation_matrix(double theta)
{
	/*
	 * Calculating rotation matrix
	 */
	// VUP matrix Points opposite of Gravity
	Mat vup = Mat::zeros(1, 3, CV_32F);
	vup.at<float>(1) = 1;
	//	cout << "VUP: "<< vup << endl;

	// Look-At Point ..... Where the camera is pointing (VPN)
	Mat look_at_point = Mat::zeros(1, 3, CV_32F);
	look_at_point.at<float>(1) = -1;
	look_at_point.at<float>(2) = -1;
	//	cout << "Look-At Point: "<<look_at_point<<endl;
	look_at_point = look_at_point / norm(look_at_point, NORM_L2);
	//	cout << "Normalized Look-At point (n): "<< look_at_point<<endl;


	// The u_axis vector
	Mat u_axis = vup.cross(look_at_point);
	//	cout << "U axis: "<< u_axis<<endl;
	u_axis = u_axis / norm(u_axis, NORM_L2);
	//	cout << "Normalized U axis: "<< u_axis<<endl;

	// The v_axis vector
	Mat v_axis = look_at_point.cross(u_axis);
	//	cout << "V_axis (should be normalized): "<<v_axis<<endl<<endl;

	/*
	 * Rotation Matrix for the camera to get the new axis
	 */
	Mat rotationMatrix;
	rotationMatrix.push_back(u_axis);
	rotationMatrix.push_back(v_axis);
	rotationMatrix.push_back(look_at_point);
	//	cout << "Rotation matrix: "<<endl<< rotationMatrix<<endl<<endl;

	/*
	 * Converting the Rotation Matrix into a Homogeneous Rotation Matrix
	 */
	Mat homogeneousRotationMatrix; //= Mat::eye(4,3, CV_32F);
	homogeneousRotationMatrix.push_back(u_axis);
	homogeneousRotationMatrix.push_back(v_axis);
	homogeneousRotationMatrix.push_back(look_at_point);

	Mat justarow = Mat::zeros(1, 3, CV_32F);
	homogeneousRotationMatrix.push_back(justarow);

	Mat justacolumn = Mat::zeros(4, 1, CV_32F);
	justacolumn.at<float>(3,0) = 1;

	hconcat(homogeneousRotationMatrix, justacolumn, homogeneousRotationMatrix);
	//	cout << "Homogeneous Rotation matrix:"<<endl<<homogeneousRotationMatrix<<endl<<endl;
	return homogeneousRotationMatrix;
}
开发者ID:cuijianzhu,项目名称:GroundPlaneEstimation,代码行数:57,代码来源:calculateparameters.cpp

示例3: getVanishingLine

Mat getVanishingLine(Mat a, Mat b, Mat c, Mat d){ //find the 
  Mat l1 = a.cross(b);
  cout << "a cross b = " << l1 << endl;
  Mat l2 = d.cross(c);
  cout << "d cross c = " << l2 << endl;
  Mat l3 = a.cross(d);
  cout << "a cross d = " << l1 << endl;
  Mat l4 = b.cross(c);
  cout << "b cross c = " << l2 << endl;
  Mat v1 = l1.cross(l2);
  Mat v2 = l3.cross(l4);

  Mat l = v1.cross(v2);
  Mat H = (Mat_<double>(3,3) << 1, 0, 0, 0, 1, 0, l.at<double>(0, 0), l.at<double>(1, 0), l.at<double>(2, 0));
    return H;
  
  //Mat l1 = a.dot(b);
  //Mat l1 = a.dot(b);
}
开发者ID:sunjianxin,项目名称:661,代码行数:19,代码来源:q1.cpp

示例4: MakeRotationMatrix

Mat MakeRotationMatrix(sparseModelPoint smp) {
    cout << "Normal (" << smp.normal[0] << "," << smp.normal[1] << "," << smp.normal[2] << "): \n";
        
    Mat R = Mat::zeros(3,3,CV_64FC1);

    Mat X = Mat(3,1,CV_64FC1,smp.normal);
    Mat Y = Mat::zeros(3,1,CV_64FC1);
    Y.col(0).row(2) = 1;
    double dotProduct = X.at<double>(2,0);
    double angle = acos(dotProduct);
    Mat cross = X.cross(Y);
    // cout << "angle: " << angle << "Cros: " << cross << "\n";
    cross = cross/norm(cross);
    // cout << "angle: " << angle << "Cros: " << cross << "\n";
    // U.col(0) = (X.col(0) + 0);
    // U.col(1) = X.cross(Y)/norm(X.cross(Y));
    // U.col(2) = (X.cross(U.col(1))+0);

    // Mat V = Mat::zeros(3,3,CV_64FC1);
    // V.col(0) = (Y.col(0) + 0);
    // V.col(1) = (U.col(1)+0);
    // V.col(2) = Y.cross(V.col(1));


    // U.t();

    double c = cos(angle);
    double s = sin(angle);
    double t = 1.0 - c;

    double x = cross.at<double>(0,0);
    double y = cross.at<double>(1,0);
    double z = cross.at<double>(2,0);

    R.at<double>(0,0) = c + x*x*t;
    R.at<double>(1,1) = c + y*y*t;
    R.at<double>(2,2) = c + z*z*t;


    double tmp1 = x*y*t;
    double tmp2 = z*s;
    R.at<double>(1,0) = tmp1 + tmp2;
    R.at<double>(0,1) = tmp1 - tmp2;
    tmp1 = x*z*t;
    tmp2 = y*s;
    R.at<double>(2,0) = tmp1 - tmp2;
    R.at<double>(0,2) = tmp1 + tmp2;    
    tmp1 = y*z*t;
    tmp2 = x*s;
    R.at<double>(2,1) = tmp1 + tmp2;
    R.at<double>(1,2) = tmp1 - tmp2;

    return R;
}
开发者ID:lioneltrebuchon,项目名称:3D-Vision,代码行数:54,代码来源:warpCircle.cpp

示例5: setXYZ

	/*

	void point3d2Mat(const Point3d& src, Mat& dest)
	{
	dest.create(3,1,CV_64F);
	dest.at<double>(0,0)=src.x;
	dest.at<double>(1,0)=src.y;
	dest.at<double>(2,0)=src.z;
	}

	void setXYZ(Mat& in, double&x, double&y, double&z)
	{
	x=in.at<double>(0,0);
	y=in.at<double>(1,0);
	z=in.at<double>(2,0);

	//	cout<<format("set XYZ: %.04f %.04f %.04f\n",x,y,z);
	}

	void lookatBF(const Point3d& from, const Point3d& to, Mat& destR)
	{
	double x,y,z;

	Mat fromMat;
	Mat toMat;
	point3d2Mat(from,fromMat);
	point3d2Mat(to,toMat);

	Mat fromtoMat;
	add(toMat,fromMat,fromtoMat,Mat(),CV_64F);
	double ndiv = 1.0/norm(fromtoMat);
	fromtoMat*=ndiv;

	setXYZ(fromtoMat,x,y,z);
	destR = Mat::eye(3,3,CV_64F);
	double yaw   =-z/abs(z)*asin(y/sqrt(y*y+z*z))/CV_PI*180.0;

	rotYaw(destR,destR,yaw);

	Mat RfromtoMat = destR*fromtoMat;

	setXYZ(RfromtoMat,x,y,z);
	double pitch =z/abs(z)*asin(x/sqrt(x*x+z*z))/CV_PI*180.0;

	rotPitch(destR,destR,pitch);
	}
	*/
	void lookat(const Point3d& from, const Point3d& to, Mat& destR)
	{
		Mat destMat = Mat(Point3d(0.0, 0.0, 1.0));
		Mat srcMat = Mat(from + to);
		srcMat = srcMat / norm(srcMat);

		Mat rotaxis = srcMat.cross(destMat);
		double angle = acos(srcMat.dot(destMat));
		//normalize cross product and multiply rotation angle
		rotaxis = rotaxis / norm(rotaxis)*angle;
		Rodrigues(rotaxis, destR);
	}
开发者ID:JuannyWang,项目名称:OpenCP,代码行数:59,代码来源:stereo_core.cpp

示例6: pitch

void Camera::pitch(double angle)
{
	Mat temp = center - eye;
	Mat rAxis = temp.cross(up);
	Mat cmat = (Mat_<double>(3, 3) <<
		0, -rAxis.at<double>(2, 0), rAxis.at<double>(1, 0),
		rAxis.at<double>(2, 0), 0, -rAxis.at<double>(0, 0),
		-rAxis.at<double>(1, 0), rAxis.at<double>(0, 0), 0);
	angle = (CV_PI / 180) * angle;
	Mat pitchingMat = Mat::eye(3, 3, CV_64F) + sin(angle) * cmat + (1 - cos(angle)) * cmat * cmat;
	rmat = pitchingMat * rmat;
}
开发者ID:nkshr,项目名称:ChessboardGenerator,代码行数:12,代码来源:chessboard_generator.cpp

示例7: getRotation

/*
 * Método para obtener la matriz de rotación dada una matriz esencial y el vector t
 */
Mat getRotation(Mat essential, Mat t){
	Mat rotation = Mat(3, 3, CV_64F);
	Mat w[3];
	Mat E_norm = essential / sqrt((trace(essential*essential.t())[0]/2));

	for(int i = 0; i < 3; i++){
		Mat row = E_norm.row(i);
		w[i] = row.cross(t);
	}

	for(int i = 0; i < 3; i++){
		rotation.row(i) = w[i] + w[(i+1)%3].cross(w[(i+2)%3]);
	}

	return rotation;
}
开发者ID:JacintoCC,项目名称:VisionPorComputador1516,代码行数:19,代码来源:camera.cpp

示例8: main

int main(){

    // Matrix initialization
    float a[] = {3,2,5,6,5,8,2,3,4};
    Mat A = Mat(3, 3, CV_32FC1, a);
    cout << "A: " << endl << A << endl << endl;

    float b[] = {7,4,3,5,3,2,1,2,9};
    Mat B = Mat(3, 3, CV_32FC1, b);
    cout << "B: " << endl << B << endl << endl;

    Mat C;

    // Vector initialization
    float d[] = {2,4,1};
    Mat D = Mat(3, 1, CV_32FC1, d);
    cout << "D: " << endl << D << endl << endl;
    float e[] = {5,2,9};
    Mat E = Mat(3, 1, CV_32FC1, e);
    cout << "E: " << endl << E << endl << endl;

    Mat F;


    // Matrix and vector multiplication
    cout << "Matrix-vector multiplication: " << A*D << endl << endl;

    // Matrix zeros
    C = Mat::zeros(3,3,CV_32FC1);
    cout << "Matrix Zeros: " << endl << C << endl << endl;

    // Matrix ones
    C = Mat::ones(3,3,CV_32FC1);
    cout << "Matrix Ones: " << endl << C << endl << endl;

    // Matrix identity
    C = Mat::eye(3,3,CV_32FC1);
    cout << "Matrix Identity: " << endl << C << endl << endl;

    // Matrix addition
    C = A + B;
    cout << "Addition: " << endl << C << endl << endl;

    // Matrix multiplication
    C = A * B;
    cout << "Multiplication: " << endl << C << endl << endl;

    // Matrix multiplication per element
    C = A.mul(B);
    cout << "Multiplication 1 to 1: " << endl << C << endl << endl;

    // Cross product
    F = D.cross(E);
    cout << "Cross product: " << endl << F << endl << endl;

    // Dot product
    F = D.dot(E);
    cout << "Dot product: " << endl << F << endl << endl;

    // Matrix inverse
    C = A.inv();
    cout << "Inverse: " << endl << C << endl << endl;

    // Matrix transpose
    C = A.t();
    cout << "Transpose: " << endl << C << endl << endl;

    // Matrix determinant
    cout << "Determinant: " << endl << determinant(A) << endl << endl;

    // Vector normalization
    normalize(D, F);
    cout << "Normalization: " << endl << F << endl << endl;

    return 0;
}
开发者ID:88enrique,项目名称:AlgebraOperations,代码行数:76,代码来源:main.cpp

示例9: cameraPoseFromHomography

//FUNCTIONS
static void cameraPoseFromHomography(vector<Point2f> corner, Mat& H, float& ext_camera_height, float& ext_pitch_angle,
		Mat image, Mat &K, const Mat &VP1, const Mat &VP2, Mat & VVP, Mat &P, Mat &camerCenter) {

	Mat NEW_K = K;
	vector<Point3f> po;

	float z = 0.;
	const float unit = HOUSE_SIZE;
	for (int i = -4; i < 5; i++) // si prende il sistema di riferimento al centro della scacchiera. In alternativa i = 0 e <9, j=0 e j<9
		for (int j = -4; j < 5; j++)
			po.push_back(Point3f((float) (j * unit), (float) (i * unit), (float) (z * unit)));

	//  MIGLIORA LA CALIBRAZIONE
	Mat distCoeffs;
	vector<Mat> rvecsCalib, tvecsCalib;
	vector<vector<Point3f> > obj;
	obj.push_back(po);
	vector<vector<Point2f> > img;
	img.push_back(corner);
	calibrateCamera(obj, img, image.size(), NEW_K, distCoeffs, rvecsCalib, tvecsCalib,
			CV_CALIB_USE_INTRINSIC_GUESS | CV_CALIB_ZERO_TANGENT_DIST | CV_CALIB_FIX_K1 | CV_CALIB_FIX_K2
					| CV_CALIB_FIX_K3 | CV_CALIB_FIX_K4 | CV_CALIB_FIX_K5 | CV_CALIB_FIX_K6);

	// BEGIN::: RICALCOLO IL VVP
	Mat w_star = NEW_K * NEW_K.t(); // DIAC
//	cout << NEW_K << w_star;
	w_star = normalize3matrix(w_star);

	Mat w = w_star.inv(); // IAC
	w = normalize3matrixf(w);
//	cout << w_star << w;

	Mat vl = VP1.cross(VP2); // line at infinity
	Mat vl_norm = normalizeLine(vl);
//	cout << vl << vl_norm;
	Mat NEW_VVP = w_star * vl_norm; // vertical vanishing point
	NEW_VVP = normalizeVectf(NEW_VVP);
	// END:::

	Mat rvec, tvec, distcoeff;
	solvePnPRansac(po, corner, NEW_K, distcoeff, rvec, tvec, false, 100, 8.0, 32, noArray(), CV_ITERATIVE);

	/*In the derivation of the camera model and its parametrization (6.10) it is assumed that
	 * the coordinate systems used in both the image and the 3D world are right handed systems,
	 * as shown in figure 6.1(pl54). However, a common practice in measuring image coordinates is
	 * that the y-coordinate increases in the downwards direction, thus defining a left handed
	 * coordinate system, contrary to figure 6.1 (pi54). A recommended practice in this case is to
	 * negate the y-coordinate of the image point so that the coordinate system again becomes right
	 * handed. However, if the image coordinate system is left handed, then the consequences are not grave.
	 * The relationship between world and image coordinates is still expressed by a 3 x 4
	 * camera matrix. Decomposition of this camera matrix according to (6.11) with K of the
	 * form (6.10) is still possible with ax and ay positive. The difference is that R now
	 * represents the orientation of the camera with respect to the negative z-axis. In addition,
	 *  the depth of points given by (6.15) will be negative instead of positive for points in
	 *  front of the camera. If this is borne in mind then it is permissible to use left handed
	 *  coordinates in the image.*/

	cv::Mat R;
	cv::Rodrigues(rvec, R); // R is 3x3
	Mat R_orig = R.clone();
	Mat t_orig = tvec.clone();
	R = R.t();  // rotation of inverse
	tvec = -R * tvec; // translation of inverse CENTRO CAMERA!

	cv::Mat T(4, 4, R.type()); // T is 4x4
	T(cv::Range(0, 3), cv::Range(0, 3)) = R * 1; // copies R into T
	T(cv::Range(0, 3), cv::Range(3, 4)) = tvec * 1; // copies tvec into T
	// fill the last row of T (NOTE: depending on your types, use float or double)
	double *p = T.ptr<double>(3);
	p[0] = p[1] = p[2] = 0;
	p[3] = 1;

	Mat trans = tvec;
	ext_camera_height = norm(trans.row(2) * HOUSE_SIZE / unit);

	/* P */

	// primo modo : calcolo esplicito dei parametri estrinseci
	P = Mat(3, 4, R.type()); // P is 3x4
	Mat KR = NEW_K * R_orig;
	Mat Kt = NEW_K * t_orig;

	P(cv::Range(0, 3), cv::Range(0, 3)) = KR * 1;
	P(cv::Range(0, 3), cv::Range(3, 4)) = Kt * 1;

	for (int pi = 0; pi < 3; pi++)
		for (int pj = 0; pj < 4; pj++)
			P.at<double>(pi, pj) = P.at<double>(pi, pj) / P.at<double>(2, 3);

	for (unsigned int i = 0; i < po.size(); i++) { // si prende il sistema di riferimento al centro della scacchiera. In alternativa i = 0 e <9, j=0 e j<9
		Mat X_i = (Mat_<double>(4, 1) << (float) po[i].x, (float) po[i].y, (float) po[i].z, 1.);
		Mat x_i = P * X_i;
		x_i = normalizeVect(x_i);

		circle(image, Point2f(x_i.at<double>(0, 0), x_i.at<double>(0, 1)), 1, Scalar(0, 0, 255), 2);
	}

	// secondo modo _ projectPoints
	vector<Point2f> imageX;
//.........这里部分代码省略.........
开发者ID:GiulioGx,项目名称:ChessMate,代码行数:101,代码来源:patternMatching.cpp

示例10: ns__cross

/* Computes a cross-product of two 3-element vectors.  */
int ns__cross(  struct soap *soap, 
			std::string InputMatFilename,
			std::string AnotherMatFilename,
			std::string &OutputMatFilename=ERROR_FILENAME)
{
	bool timeChecking, memoryChecking;
	getConfig(timeChecking, memoryChecking);
	if(timeChecking){
		start = omp_get_wtime();
	}

    /* read from bin */
    Mat src;
	Mat dst;
	if(!readMat(InputMatFilename, src))
    {
		Log(logERROR) << "cross :: can not read bin file for src1" << std::endl;
        return soap_receiver_fault(soap, "cross :: can not read bin file for src1", NULL);
    }
	
	Mat anotherMat;
	if(!readMat(AnotherMatFilename, anotherMat))
    {
		Log(logERROR) << "cross:: can not read bin file for src2" << std::endl;
        return soap_receiver_fault(soap, "cross :: can not read bin file for src2", NULL);
    }
	try{
        dst = src.cross(anotherMat);
    } catch( cv::Exception& e ) {
        Log(logERROR) << e.what() << std::endl;
        return soap_receiver_fault(soap, e.what(), NULL);
    }
    
	std::string toAppend = "_cross";
    getOutputFilename(OutputMatFilename, toAppend);
    if(!saveMat(OutputMatFilename, dst))
    {
        Log(logERROR) << "cross :: can not save mat to binary file" << std::endl;
        return soap_receiver_fault(soap, "cross :: can not save mat to binary file", NULL);
    }

    src.release();
    dst.release();
    anotherMat.release();

	if(timeChecking) 
	{ 
		end = omp_get_wtime();
		Log(logINFO) << "cross :: " << "time elapsed " << end-start << std::endl;
	}
	
	if(memoryChecking)
	{	
		double vm, rss;
		getMemoryUsage(vm, rss);
		Log(logINFO)<< "mul :: VM usage :" << vm << std::endl 
					<< "Resident set size :" << rss << std::endl;
	}

    return SOAP_OK;
}
开发者ID:FranoTech,项目名称:ws-workflow,代码行数:62,代码来源:BasicStructuresServer.cpp

示例11: computeRotation

// TODO: I can't math D:
void computeRotation(Camera c, sparseSiftFeature *s, sparseModelPoint smp){
    // Turning quaternion to rotation matrix: https://en.wikipedia.org/wiki/Rotation_matrix#Quaternion
    // Confirmation: https://groups.google.com/forum/#!topic/vsfm/V4lhITH2yHw
    double to_camera[3][3];
    double w = c.quaternion[0];  // order right!
    double x = c.quaternion[1];
    double y = c.quaternion[2];
    double z = c.quaternion[3];
    to_camera[0][0] = 1 - 2*y*y - 2*z*z;
    to_camera[0][1] = 2*x*y - 2*z*w;
    to_camera[0][2] = 2*x*z + 2*y*w;
    to_camera[1][0] = 2*x*y + 2*z*w;
    to_camera[1][1] = 1 - 2*x*x - 2*z*z;
    to_camera[1][2] = 2*y*z - 2*x*w;
    to_camera[2][0] = 2*x*z - 2*y*w;
    to_camera[2][1] = 2*y*z + 2*x*w;
    to_camera[2][2] = 1 - 2*x*x - 2*y*y;

    Mat vec1;
    Mat vec2;
    Mat X = Mat::zeros(3,1,CV_64FC1);
    X.col(0).row(2) = 1;
    Mat up = Mat::zeros(3,1,CV_64FC1);
    up.col(0).row(0) = 1;
    vec1 = X.cross(up);
    vec1 = vec1/norm(vec1);
    vec2 = vec1.cross(X);
    vec2 = vec2/norm(vec2);

    Mat R_C2W = Mat::zeros(3,3,CV_64FC1);
    R_C2W.row(0) = vec1.t();
    R_C2W.row(1) = vec2.t();
    R_C2W.row(2) = X.t();


    Mat R_C1W = Mat::zeros(3,3,CV_64FC1);
    R_C1W.col(0).row(0) = 1;
    R_C1W.col(1).row(0) = 0;
    R_C1W.col(2).row(0) = 0;

    R_C1W.col(0).row(1) = 0;
    R_C1W.col(1).row(1) = 0.6428;
    R_C1W.col(2).row(1) = -0.7660;

    R_C1W.col(0).row(2) = 0;
    R_C1W.col(1).row(2) = 0.7660;
    R_C1W.col(2).row(2) = 0.6428;


    // TODO: UNDERSTAND WHICH FINAL TRANSPOSE TO USE
    // R_C1W = R_C1W.t();
    // cout << "toCamera:" << XY_to_camera << "\n";
    // Mat trans = Mat(3,1,CV_64FC1,s->translation);
    // trans = XY_to_camera*trans;
    // Mat Normal_to_XY = MakeRotationMatrix(smp);
    // cout << "toXY:" << Normal_to_XY << "\n";
    // Mat rot = XY_to_camera*Normal_to_XY;
    // // rot = rot.inv();
    Mat R = R_C2W*R_C1W.t();

    for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++){
            s->rotation[i][j] = R.at<double>(i,j);
            s->R_C1W[i][j] = R_C1W.at<double>(i,j);
        }
    }

    //cout << "Rotation: " << rot << "\n";
    
}
开发者ID:lioneltrebuchon,项目名称:3D-Vision,代码行数:71,代码来源:warpCircle.cpp

示例12: main

int main(int argc, char** argv) {

    cout << "Welcome to Le Fancy Vase Drawer.\n" << endl;
    printf("Instructions:\n"\
           "r,g,b - Change colour of mesh to red, green, blue\n"\
           "k     - Colour the mesh black\n"\
           "p     - RAINBOW.\n"\
           "1,3   - Zoom in, zoom out\n"\
           "w,s   - Move camera up, down\n"\
           "a,d   - Rotate mesh left, right\n"\
           "q,e   - Move gaze point up, down\n"\
           "z,c   - Move camera and gaze point up, down\n");

    float viewingAngle = 60.; // degrees
    float aspectRatio = 1;
    float N = 5.;  // near plane
    float F = 30.; // far plane
    float t = N * tan(CV_PI / 360 * viewingAngle); // top
    float b = -t; // bottom
    float r = aspectRatio*t; // right
    float l = -r; // left
    int   w = 512,
          h = 512;

    bool camChanged = true;
    bool rainbow = true;
    int rotationInc = 5;
    int roll = 0;

    namedWindow(wndName, CV_WINDOW_AUTOSIZE);

    // used as row vectors, so they can be appended to Matrix easily
    Mat e = (Mat_<float>(1, 3) << 30., 30., 22.); // camera vector.  15, 15, 10
    Mat g = (Mat_<float>(1, 3) <<  0., 0., 18.); // a point through which the gaze direction unit vector n points to
    Mat p = (Mat_<float>(1, 3) <<  0., 0., 1.); // x, y, z, w
    Mat n, u, v;
    Mat screen(w, h, CV_8UC3);
    int flip = 1; // -1 to flip along X

    Mat Mv(0, 3, CV_32FC1);

    Mat S1T1Mp = (Mat_<float>(4, 4) <<
                  (2*N)/(r-l), 0, (r+l)/(r-l), 0,
                  0, (2*N)/(t-b), (t+b)/(t-b), 0,
                  0, 0, -(F+N)/(F-N), -2*F*N/(F-N),
                  0, 0, -1, 0
                  );

    Mat WS2T2 = (Mat_<float>(4, 4) <<
                 w/2, 0, 0, w/2,
                 0, flip*h/2, 0, -h/2+h,
                 0, 0, 1, 0,
                 0, 0, 0, 1
                 );

    // container for screen coords
    vector<Point2i> coords;

    // background colour and line colour
    Scalar bgColour(255, 255, 255);
    Scalar lineColour(0);

    // HSV and BGR matrices for colours of the rainbow
    int sat = 200, val = 200;
    Mat hsv(Size(1,1),CV_8UC3, Scalar(10,sat,val)), bgr;

    // the polygonal mesh object
    PolygonalMesh poly;
    poly.readFromFile("PolyVase.xml");

    bool normalChanged = true;

    char c = -1; // input char
    while (true) {
        if (camChanged) {
            if (normalChanged) {
                // normalize vector from camera to gaze point
                normalize(e - g, n);
                // generate vectors describing camera plane
                //u = (getRotationMatrix(n, rotationInc) * u.t()).t();
                //v = (getRotationMatrix(n, rotationInc) * v.t()).t();
                // normalize to keep window same size
                //normalize(u, u);
                //normalize(v, v);
                u = p.cross(n);
                v = u.cross(n);
                u = (getRotationMatrix(n, roll) * u.t()).t();
                v = (getRotationMatrix(n, roll) * v.t()).t();
                normalize(u, u);
                normalize(v, v);

                normalChanged = false;
            }

            // construct matrix for world coords to camera viewing coords
            Mv = Mat(0, 3, CV_32FC1);
            Mv.push_back(u);
            Mv.push_back(v);
            Mv.push_back(n);
            Mv = Mv.t();
//.........这里部分代码省略.........
开发者ID:Inventor22,项目名称:Projects,代码行数:101,代码来源:Source.cpp


注:本文中的Mat::cross方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。