vector和QMap简单使用记忆qt中QPointF类型和CV中Point2f和Mat的使用细节,

21 篇文章 0 订阅

直接从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 是没有问题的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值