直接从Qt的一个程序来说。
头文件如下:
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QtGui/QMainWindow> #include <opencv2/opencv.hpp> #include <QDebug> #include <QPoint> #include <QMap> #include <iostream> using namespace std; using namespace cv; class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = 0); ~MainWindow(); Mat mat; QMap<int, QPointF> landmarks; vector<QPointF> vec_pt_q;//定义一个向量,储存QPoint类型的点 vector<Point2f> vec_pt_cv;//定义一个向量,储存cv类型的点 Point2f pointcv; QPointF point; }; #endif // MAINWINDOW_H
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) { pointcv.x = 0.5; pointcv.y = 25; point = QPointF(0.3,0.6); //PointF这么赋值,下面的赋值方式错误。cv类型可以这么赋值,如上。 // point.x()=0.3; //错误的赋值方式 // point.y()=0.6; //会提示: 错误:lvalue required as left operand of assignment。给错误下面解释 /******************vector使用实验****************************/ //vector和QMap的初始化都可以这样,特别是保存鼠标之类的取点的时候。前者用push_bach,后者用insert vec_pt_q.push_back(point); //QPoint类型 vec_pt_q.push_back(QPointF(pointcv.x,pointcv.y)); for(int i = 0;i<vec_pt_q.size();i++) { qDebug()<<i<<vec_pt_q.at(i).x(); //切记:QPoint的分量要写成x(),一定要括号。cv的Point2f则是不许要括号的。 } vec_pt_cv.push_back(pointcv); vec_pt_cv.push_back(Point2f(point.x(),point.y())); //cv类型的点 for(int i = 0;i<vec_pt_cv.size();i++) { qDebug()<<i<<vec_pt_cv.at(i).x; //切记:QPoint的分量要写成x(),一定要括号。cv的Point2f则是不许要括号的。 } /******************QMap的输出各个变量*************************/ landmarks.insert(1,QPointF(pointcv.x,pointcv.y)); landmarks.insert(2,point); for(int i = 1;i<3;i++) { qDebug()<<i<<landmarks.value(i).x(); } QMap<int, QPointF>::const_iterator i; //定义一个迭代器访问QMap,vector也有同样的方法 for( i = landmarks.constBegin();i!=landmarks.constEnd();i++) { qDebug()<<i.key()<<i.value();//value()括号里面不能加i } /****************cv中点转化为QPoint*************************/ point = QPointF(pointcv.x,pointcv.y); qDebug()<<point.x() <<point.y()<<endl; /*******************输出cv中的矩阵****************************/ mat = Mat::ones(3,3,CV_32FC1); qDebug()<<mat.at<float>(0,0)<<mat.at<float>(1,1)<<endl<<mat.at<float>(2,2); cout<<mat<<endl; //也可这样直接显示整个矩阵 } MainWindow::~MainWindow() { }
错误:lvalue required as left operand of assignmentlvalue:左值是指可以被赋值的表达式。左值位于赋值语句的左侧与其相对的右值(rvaule)则位于赋值语句的右侧。
.这个操作符 对于一个类的成员变量 和对于一个结构体的成员变量 结果是不一样的(类和结构体区别要研究)
比如类A存在成员变量b 那么A.b实际上是在调用[A b],也就是这个成员变量的getter,所以你的=号的左边变成了[A b].xx.xx 这在objc是不允许的
但是对于结构体A的成员b A.b就是b本身 所以 A.b = xxx 是没有问题的。