Skip to content
This repository has been archived by the owner on Jan 24, 2019. It is now read-only.

Commit

Permalink
Merge pull request #4 from agriic/master
Browse files Browse the repository at this point in the history
Bug fixes for widget redraw and flipped image.
  • Loading branch information
Walter Lucetti committed Jun 13, 2016
2 parents 3cd0f92 + ac9616c commit 307c658
Show file tree
Hide file tree
Showing 2 changed files with 50 additions and 80 deletions.
117 changes: 43 additions & 74 deletions cqtopencvviewergl/cqtopencvviewergl.cpp
@@ -1,19 +1,12 @@
#include "cqtopencvviewergl.h"

#include <QOpenGLFunctions>
#include <opencv2/opencv.hpp>

CQtOpenCVViewerGl::CQtOpenCVViewerGl(QWidget *parent) :
QOpenGLWidget(parent)
QOpenGLWidget(parent)
{
mSceneChanged = false;
mBgColor = QColor::fromRgb(150, 150, 150);

mOutH = 0;
mOutW = 0;
mImgRatio = 4.0f/3.0f;

mPosX = 0;
mPosY = 0;
}

void CQtOpenCVViewerGl::initializeGL()
Expand All @@ -25,8 +18,6 @@ void CQtOpenCVViewerGl::initializeGL()
float g = ((float)mBgColor.darker().green())/255.0f;
float b = ((float)mBgColor.darker().blue())/255.0f;
glClearColor(r,g,b,1.0f);

// qglClearColor(mBgColor.darker()); obsolete
}

void CQtOpenCVViewerGl::resizeGL(int width, int height)
Expand All @@ -37,50 +28,29 @@ void CQtOpenCVViewerGl::resizeGL(int width, int height)
glMatrixMode(GL_PROJECTION);
glLoadIdentity();

glOrtho(0, width, 0, height, 0, 1); // To Draw image in the center of the area
glOrtho(0, width, -height, 0, 0, 1);

glMatrixMode(GL_MODELVIEW);

// ---> Scaled Image Sizes
mOutH = width/mImgRatio;
mOutW = width;

if(mOutH>height)
{
mOutW = height*mImgRatio;
mOutH = height;
}
recalculatePosition();

emit imageSizeChanged( mOutW, mOutH );
// <--- Scaled Image Sizes

mPosX = (width-mOutW)/2;
mPosY = (height-mOutH)/2;

mSceneChanged = true;
emit imageSizeChanged(mRenderWidth, mRenderHeight);

updateScene();
}

void CQtOpenCVViewerGl::updateScene()
{
if( mSceneChanged && this->isVisible() )
//updateGL(); obsolete
update();
if (this->isVisible()) update();
}

void CQtOpenCVViewerGl::paintGL()
{
makeCurrent();

if( !mSceneChanged )
return;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

renderImage();

mSceneChanged = false;
}

void CQtOpenCVViewerGl::renderImage()
Expand All @@ -93,38 +63,25 @@ void CQtOpenCVViewerGl::renderImage()
{
glLoadIdentity();

QImage image; // the image rendered

glPushMatrix();
{
int imW = mRenderQtImg.width();
int imH = mRenderQtImg.height();

// The image is to be resized to fit the widget?
if( imW != this->size().width() &&
imH != this->size().height() )
if (mResizedImg.width() <= 0)
{

image = mRenderQtImg.scaled( //this->size(),
QSize(mOutW,mOutH),
Qt::IgnoreAspectRatio,
Qt::SmoothTransformation
);

//qDebug( QString( "Image size: (%1x%2)").arg(imW).arg(imH).toAscii() );
if (mRenderWidth == mRenderQtImg.width() && mRenderHeight == mRenderQtImg.height())
mResizedImg = mRenderQtImg;
else
mResizedImg = mRenderQtImg.scaled(QSize(mRenderWidth, mRenderHeight),
Qt::IgnoreAspectRatio,
Qt::SmoothTransformation);
}
else
image = mRenderQtImg;

// ---> Centering image in draw area

glRasterPos2i( mPosX, mPosY );
// <--- Centering image in draw area
glRasterPos2i(mRenderPosX, mRenderPosY);

imW = image.width();
imH = image.height();
glPixelZoom(1, -1);

glDrawPixels( imW, imH, GL_RGBA, GL_UNSIGNED_BYTE, image.bits());
glDrawPixels(mResizedImg.width(), mResizedImg.height(), GL_RGBA, GL_UNSIGNED_BYTE, mResizedImg.bits());
}
glPopMatrix();

Expand All @@ -133,26 +90,38 @@ void CQtOpenCVViewerGl::renderImage()
}
}

bool CQtOpenCVViewerGl::showImage(cv::Mat image)
void CQtOpenCVViewerGl::recalculatePosition()
{
image.copyTo(mOrigImage);
mImgRatio = (float)mOrigImage.cols/(float)mOrigImage.rows;

mRenderWidth = this->size().width();
mRenderHeight = floor(mRenderWidth / mImgRatio);

if (mRenderHeight > this->size().height())
{
mRenderHeight = this->size().height();
mRenderWidth = floor(mRenderHeight * mImgRatio);
}

mImgRatio = (float)image.cols/(float)image.rows;
mRenderPosX = floor((this->size().width() - mRenderWidth) / 2);
mRenderPosY = -floor((this->size().height() - mRenderHeight) / 2);

if( mOrigImage.channels() == 3)
mRenderQtImg = QImage((const unsigned char*)(mOrigImage.data),
mOrigImage.cols, mOrigImage.rows,
mOrigImage.step, QImage::Format_RGB888)/*.rgbSwapped()*/;
else if( mOrigImage.channels() == 1)
mRenderQtImg = QImage((const unsigned char*)(mOrigImage.data),
mOrigImage.cols, mOrigImage.rows,
mOrigImage.step, QImage::Format_Indexed8);
else
return false;
mResizedImg = QImage();
}

bool CQtOpenCVViewerGl::showImage(const cv::Mat& image)
{
if (image.channels() == 3)
cvtColor(image, mOrigImage, CV_BGR2RGBA);
else if (mOrigImage.channels() == 1)
cvtColor(image, mOrigImage, CV_GRAY2RGBA);
else return false;

//mRenderQtImg = QGLWidget::convertToGLFormat(mRenderQtImg); obsolete
mRenderQtImg = QImage((const unsigned char*)(mOrigImage.data),
mOrigImage.cols, mOrigImage.rows,
mOrigImage.step1(), QImage::Format_RGB32);

mSceneChanged = true;
recalculatePosition();

updateScene();

Expand Down
13 changes: 7 additions & 6 deletions cqtopencvviewergl/cqtopencvviewergl.h
Expand Up @@ -15,7 +15,7 @@ class CQtOpenCVViewerGl : public QOpenGLWidget, protected QOpenGLFunctions_2_0
void imageSizeChanged( int outW, int outH ); /// Used to resize the image outside the widget

public slots:
bool showImage(cv::Mat image); /// Used to set the image to be viewed
bool showImage(const cv::Mat& image); /// Used to set the image to be viewed

protected:
void initializeGL(); /// OpenGL initialization
Expand All @@ -26,20 +26,21 @@ public slots:
void renderImage();

private:
bool mSceneChanged; /// Indicates when OpenGL view is to be redrawn

QImage mRenderQtImg; /// Qt image to be rendered
QImage mResizedImg;
cv::Mat mOrigImage; /// original OpenCV image to be shown

QColor mBgColor; /// Background color

int mOutH; /// Resized Image height
int mOutW; /// Resized Image width
float mImgRatio; /// height/width ratio

int mPosX; /// Top left X position to render image in the center of widget
int mPosY; /// Top left Y position to render image in the center of widget
int mRenderWidth;
int mRenderHeight;
int mRenderPosX;
int mRenderPosY;

void recalculatePosition();
};

#endif // CQTOPENCVVIEWERGL_H

0 comments on commit 307c658

Please sign in to comment.