直接从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
cpp文件如下:
#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 assignment
lvalue:左值是指可以被赋值的表达式。左值位于赋值语句的左侧与其相对的右值(rvaule)则位于赋值语句的右侧。赋值语句都必须有一个左值和一个右值。左值必须是内存一个可存储的变量,而不能是一个常量。
.这个操作符 对于一个类的成员变量 和对于一个结构体的成员变量 结果是不一样的(类和结构体区别要研究)
比如类A存在成员变量b 那么A.b实际上是在调用[A b],也就是这个成员变量的getter,所以你的=号的左边变成了[A b].xx.xx 这在objc是不允许的
但是对于结构体A的成员b A.b就是b本身 所以 A.b = xxx 是没有问题的。