#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QTime>
QString image_name = "d:/2.bmp";
void convert_qimg_to_mat(QImage& src,cv::Mat& dst,bool keepalpha)
{
int w,h;
const uchar* d1;
uchar *d2;
if(src.isNull())
return;
if (src.format() == QImage::Format_RGB888)
src = src.convertToFormat(QImage::Format_ARGB32);
if (src.format() == QImage::Format_ARGB32 || src.format() == QImage::Format_RGB32){
if (keepalpha){
dst.create(src.height(),src.width(),CV_8UC4);
for(h = 0;h < src.height();h ++){
d1 = src.scanLine(h);
d2 = dst.ptr(h);
for(w = 0;w < src.width();w ++){
*d2 = *d1;
*(d2 + 1) = *(d1 + 1);
*(d2 + 2) = *(d1 + 2);
*(d2 + 3) = *(d1 + 3);
d1 += 4;
d2 += 4;
}
}
}
else{
dst.create(src.height(),src.width(),CV_8UC3);
for(h = 0;h < src.height();h ++){
d1 = src.scanLine(h);
d2 = dst.ptr(h);
for(w = 0;w < src.width();w ++){
*d2 = *d1;
*(d2 + 1) = *(d1 + 1);
*(d2 + 2) = *(d1 + 2);
d1 += 4;
d2 += 3;
}
}
}
return;
}
if(src.format() == QImage::Format_Grayscale8){
dst.create(src.height(),src.width(),CV_8UC1);
for(h = 0;h < src.height();h ++){
d1 = src.scanLine(h);
d2 = dst.ptr(h);
for(w = 0;w < src.width();w ++){
*d2 = *d1;
d1 ++;
d2 ++;
}
}
return;
}
}
void convert_mat_to_qimg(const cv::Mat& src,QImage& dst)
{
int w,h;
const uchar *d1;
uchar *d2;
if(src.empty())
return;
if(src.type() == CV_8UC1){
dst = QImage(src.cols,src.rows,QImage::Format_Grayscale8);
for(h = 0;h < src.rows;h ++){
d1 = src.ptr(h);
d2 = dst.scanLine(h);
for(w = 0;w < src.cols;w ++){
*d2 = *d1;
d1 ++;
d2 ++;
}
}
return;
}
if(src.type() == CV_8UC3){
dst = QImage(src.cols,src.rows,QImage::Format_ARGB32);
for(h = 0;h < src.rows;h ++){
d1 = src.ptr(h);
d2 = dst.scanLine(h);
for(w = 0;w < src.cols;w ++){
*d2 = *d1;
*(d2 + 1) = *(d1 + 1);
*(d2 + 2) = *(d1 + 2);
*(d2 + 3) = 255;
d1 += 3;
d2 += 4;
}
}
return;
}
if(src.type() == CV_8UC4){
dst = QImage(src.cols,src.rows,QImage::Format_ARGB32);
for(h = 0;h < src.rows;h ++){
d1 = src.ptr(h);
d2 = dst.scanLine(h);
for(w = 0;w < src.cols;w ++){
*d2 = *d1;
*(d2 + 1) = *(d1 + 1);
*(d2 + 2) = *(d1 + 2);
*(d2 + 3) = *(d1 + 3);
d1 += 4;
d2 += 4;
}
}
return;
}
}
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
cubicCoeffs = nullptr;
max = 10000;
this->resize(900,300);
srcLabel = new QLabel(this);
dstLabel = new QLabel(this);
source = new QImage();
showing = new QImage();
source->load(image_name);//load your image
*showing = source->copy();
button = new QPushButton("恢复",this);
connect(button,&QPushButton::pressed,this,&MainWindow::onButtonPressed);
button1 = new QPushButton("转换成圆形",this);
connect(button1,&QPushButton::pressed,this,&MainWindow::onButtonPressed);
slider00 = new QSlider(Qt::Horizontal,this);
slider02 = new QSlider(Qt::Horizontal,this);
slider04 = new QSlider(Qt::Horizontal,this);
slider06 = new QSlider(Qt::Horizontal,this);
slider08 = new QSlider(Qt::Horizontal,this);
slider10 = new QSlider(Qt::Horizontal,this);
connect(slider00,&QSlider::valueChanged,this,&MainWindow::onSliderValueChanged);
connect(slider02,&QSlider::valueChanged,this,&MainWindow::onSliderValueChanged);
connect(slider04,&QSlider::valueChanged,this,&MainWindow::onSliderValueChanged);
connect(slider06,&QSlider::valueChanged,this,&MainWindow::onSliderValueChanged);
connect(slider08,&QSlider::valueChanged,this,&MainWindow::onSliderValueChanged);
connect(slider10,&QSlider::valueChanged,this,&MainWindow::onSliderValueChanged);
slider00->setRange(0,max);
slider02->setRange(0,max);
slider04->setRange(0,max);
slider06->setRange(0,max);
slider08->setRange(0,max);
slider10->setRange(0,max);
initialize();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::initialize()
{
vector<double>().swap(dstY);
vector<double>().swap(srcX);
//srcX(not change after initialize)
srcX.push_back(0.0f);
srcX.push_back(0.2f);
srcX.push_back(0.4f);
srcX.push_back(0.6f);
srcX.push_back(0.8f);
srcX.push_back(1.0f);
//dstY
for (int i = 0;i < (int)srcX.size();i++)
{
float v = asin(srcX.at(i)) * 2 / PI;
if (v > 1.0f)
v = 1.0f;
dstY.push_back(v);
if (i == 0)
slider00->setValue(max * v);
if (i == 1)
slider02->setValue(max * v);
if (i == 2)
slider04->setValue(max * v);
if (i == 3)
slider06->setValue(max * v);
if (i == 4)
slider08->setValue(max * v);
if (i == 5)
slider10->setValue(max * v);
}
cubicSpline.calCubicSplineCoeffs(srcX, dstY, cubicCoeffs, CUBIC_NATURAL, CUBIC_WITHOUT_FILTER);//CUBIC_MEDIAN_FILTER
Mat _src,_dst;
convert_qimg_to_mat(*source,_src,false);
fisheye(_src,_dst);
convert_mat_to_qimg(_dst,*showing);
update();
}
void MainWindow::onButtonPressed()
{
QObject *_sender = sender();
if (_sender == button)
{
source->load(image_name);//load your image
*showing = source->copy();
initialize();
}
if (_sender == button1){
Mat _src,_dst;
convert_qimg_to_mat(*source,_src,false);
compress_to_round(_src,_dst);
convert_mat_to_qimg(_dst,*source);
initialize();
}
}
void MainWindow::compress_to_round(const Mat& src,Mat &dst)
{
dst.create(src.rows, src.cols, CV_8UC3);
dst.setTo(0);
Point2f center;
center.x = src.cols / 2.0;
center.y = src.rows / 2.0;
double rr = center.x;
if (center.y < center.x)
rr = center.y;
int _step = rr / 20.0;
if (_step < 2)
_step = 2;
std::vector<cv::Point2f> _src_pts,_dst_pts;
for (int i = 0;i < src.cols;i += _step){
double xd = 1.0 * (i - center.x);
double yd = 1.0 * (0 - center.y);
double phid = atan2(yd, xd);//angle
double nx = cos(phid) * rr + center.x;
double ny = sin(phid) * rr + center.y;
_src_pts.push_back(Point2f(i,0));
_dst_pts.push_back(Point2f(nx,ny));
}
for (int i = 0;i < src.cols;i += _step){
double xd = 1.0 * (i - center.x);
double yd = 1.0 * (src.rows - 1 - center.y);
double phid = atan2(yd, xd);//angle
double nx = cos(phid) * rr + center.x;
double ny = sin(phid) * rr + center.y;
_src_pts.push_back(Point2f(i,src.rows - 1));
_dst_pts.push_back(Point2f(nx,ny));
}
for (