#pragma execution_character_set("utf-8")
#include "QGuiCalib3d.h"
#include "ui_QGuiCalib3d.h"
#include "QGuiCalib3d.h"
#include <QMessageBox>
#include <vector>
#include <QDateTime>
#include <QDir>
#include <QGraphicsScene>
#include<QObject>
#include<QFileDialog>
#include<QDebug>
#include<opencv2/calib3d.hpp>
#include <fstream>
#include <iostream>
using namespace cv;
using namespace std;
QGuiCalib3d::QGuiCalib3d(QWidget *parent) :
QWidget(parent),
ui(new Ui::QGuiCalib3d)
{
ui->setupUi(this);
m_vcImagePointsSeq.clear();
m_boardSize.width = 9;
m_boardSize.height = 6;
m_squareSize.width = 10;
m_squareSize.height = 10;
// 摄像机内参数矩阵
m_cameraMatrix = Mat(3, 3, CV_32FC1, Scalar::all(0));
// 摄像机的5个畸变系数:k1,k2,p1,p2,k3
m_distCoeffs = Mat(1, 5, CV_32FC1, Scalar::all(0));
QString szText;
szText.sprintf("%d", m_boardSize.width);
ui->lineEditBoardCol->setText(szText);
szText.sprintf("%d", m_boardSize.height);
ui->lineEditBoardRow->setText(szText);
szText.sprintf("%d", m_squareSize.width);
ui->lineEditSquareWidth->setText(szText);
szText.sprintf("%d", m_squareSize.height);
ui->lineEditSquareHeight->setText(szText);
ui->lineEditMinThreshold->setText("20");
ui->lineEditMaxThreshold->setText("150");
ui->checkBoxFilterByArea->setCheckState(Qt::Unchecked);
ui->lineEditMinArea->setText("10");
ui->lineEditMinArea->hide();
ui->lineEditMaxArea->setText("100");
ui->lineEditMaxArea->hide();
// connect(ui->checkBoxFilterByArea, SIGNAL(stateChanged(int)),
// this, SLOT(checkBoxFilterByArea_stateChanged(int)));
ui->checkBoxFilterByColor->setCheckState(Qt::Unchecked);
ui->lineEditColor->setText("100");
ui->lineEditColor->hide();
// connect(ui->checkBoxFilterByColor, SIGNAL(stateChanged(int)),
// this, SLOT(checkBoxFilterByColor_stateChanged(int)));
ui->checkBoxFilterByCircularity->setCheckState(Qt::Unchecked);
ui->lineEditMinCircularity->setText("0.4");
ui->lineEditMinCircularity->hide();
ui->lineEditMaxCircularity->setText("0.8");
ui->lineEditMaxCircularity->hide();
// connect(ui->checkBoxFilterByCircularity, SIGNAL(stateChanged(int)), this,
// SLOT(checkBoxFilterByCircularity_stateChanged(int)));
ui->checkBoxFilterByInertia->setCheckState(Qt::Unchecked);
ui->lineEditMinInertia->setText("1");
ui->lineEditMinInertia->hide();
ui->lineEditMaxInertia->setText("4");
ui->lineEditMaxInertia->hide();
// connect(ui->checkBoxFilterByInertia, SIGNAL(stateChanged(int)), this,
// SLOT(checkBoxFilterByInertia_stateChanged(int)));
ui->checkBoxFilterByConvexity->setCheckState(Qt::Checked);
ui->lineEditMinConvexity->setText("0.9");
ui->lineEditMaxConvexity->setText("1.1");
// connect(ui->checkBoxFilterByConvexity, SIGNAL(stateChanged(int)), this,
// SLOT(checkBoxFilterByConvexity_stateChanged(int)));
m_nDetectTimes = 0;
szText.sprintf("%d", m_nDetectTimes);
ui->lineEditDetectNum->setText(szText);
// connect(ui->btnPickCheckerboardCorner, SIGNAL(clicked()), this, SLOT(on_btnPickCheckerboardCorner_clicked()));
// connect(ui->btnPickCircleCorner, SIGNAL(clicked()), this, SLOT(btnPickCircleCorner_clicked()));
// connect(ui->btnCalcCalibData, SIGNAL(clicked()), this, SLOT(btnCalcCalibData_clicked()));
// connect(ui->btnRestoreImage, SIGNAL(clicked()), this, SLOT(btnRestoreImage_clicked()));
}
QGuiCalib3d::~QGuiCalib3d()
{
delete ui;
}
void QGuiCalib3d::recvShowPicSignal(QImage image)
{
QPixmap ConvertPixmap = QPixmap::fromImage(image);//The QPixmap class is an off-screen image representation that can be used as a paint device
QGraphicsScene* qgraphicsScene = new QGraphicsScene;//要用QGraphicsView就必须要有QGraphicsScene搭配着用
m_pImage = new QImageWidgetItem(&ConvertPixmap);//实例化类ImageWidget的对象m_Image,该类继承自QGraphicsItem,是自己写的类
int nwith = ui->graphicsViewCalib->width();//获取界面控件Graphics View的宽度
int nheight = ui->graphicsViewCalib->height();//获取界面控件Graphics View的高度
m_pImage->setQGraphicsViewWH(nwith, nheight);//将界面控件Graphics View的width和height传进类m_Image中
qgraphicsScene->addItem(m_pImage);//将QGraphicsItem类对象放进QGraphicsScene中
ui->graphicsViewCalib->setSceneRect(QRectF(-(nwith / 2), -(nheight / 2), nwith, nheight));//使视窗的大小固定在原始大小,不会随图片的放大而放大(默认状态下图片放大的时候视窗两边会自动出现滚动条,并且视窗内的视野会变大),防止图片放大后重新缩小的时候视窗太大而不方便观察图片
ui->graphicsViewCalib->setScene(qgraphicsScene);//Sets the current scene to scene. If scene is already being viewed, this function does nothing.
ui->graphicsViewCalib->setFocus();//将界面的焦点设置到当前Graphics View控件
}
void QGuiCalib3d::getMat(Mat Img)
{
m_srcImage = Img.clone();
}
//提取角点
void QGuiCalib3d::on_btnPickCheckerboardCorner_clicked()
{
int image_count = 0; /* 图像数量 */
Size image_size; /* 图像的尺寸 */
vector<Point2f> image_points_buf; /* 缓存每幅图像上检测到的角点 */
vector<vector<Point2f>> image_points_seq; /* 保存检测到的所有角点 */
/*==========================================================*/
cout<<"files.count(): "<<files.count()<<endl;
for(int m=0; m<files.count();m++)
{
cout<<files[m].toStdString()<<endl;
}
/*==========================================================*/
for (int m =0;m<files.count();m++)
{
image_count++;
QString fileName = files[m];
cout<<"m0: "<<m<<endl;
cout<<"image_count: "<<image_count<<endl;
cout<<"fileName: "<<fileName.toStdString()<<endl;
cv::Mat imageInput = imread(fileName.toStdString());
// getMat(imageInput);
m_srcImage = imageInput.clone();
/************************调试**************************/
if(m==0)
cout<<"fileName[0]: "<<fileName.toStdString()<<endl;
cout<<"m_srcImage: "<<m_srcImage.size()<<endl;
uchar* p = m_srcImage.ptr<uchar>(1);
cout<<"m_srcImage.pix: "<<p[m]<<endl;
//================================================//
// 读入第一张图片时获取图片大小
if(image_count == 1)
{
image_size.width = m_srcImage.cols;
image_size.height = m_srcImage.rows;
}
/* 提取角点 需要使用findChessboardCorners函数提取角点 */
if (m_srcImage.data)
{
m_boardSize.width = ui->lineEditBoardCol->text().toInt();
m_boardSize.height = ui->lineEditBoardRow->text().toInt();
cout<<"进入if()Data循环体"<<endl;
try
{
//缓存每幅图像上检测到的角点
vector<Point2f> imageCorner;
//OpenCV4.3只需要使用findChessboardCornersSB提取角点即可,精度也提高了
bool bFind = findChessboardCornersSB(
m_srcImage, //源棋盘视图。 它必须是8位灰度或彩色图像
m_boardSize, //每个棋盘行和列的内角数
imageCorner,//检测到的角点数据
CALIB_CB_NORMALIZE_IMAGE | CALIB_CB_EXHAUSTIVE | CALIB_CB_ACCURACY);//各种标志位
if (bFind)
{
cout<<"bFind: "<<bFind<<endl;
m_nDetectTimes++;
QString szText;
szText.sprintf("%d", m_nDetectTimes);
ui->lineEditDetectNum->setText(szText);
- 1
- 2
- 3
- 4
- 5
- 6
前往页