Виджет IplImageWidget для вывода изображения с картинки типа IplImage (из библиотеки OpenCV (компьютерное зрение))
class IplImageWidget : public QWidget
{
Q_OBJECT
public:
IplImageWidget(QWidget* parent = 0, Qt::WFlags fl = 0 );
~IplImageWidget();
void initWidget(CvCapture* video);
void PutImage(IplImage* img);
protected:
void paintEvent(QPaintEvent*);
private:
QImage qimage;
QImage qimage1;
IplImage* opencvimg;
IplImage* opencvimg1;
};
IplImageWidget::IplImageWidget(QWidget* parent, Qt::WFlags fl)
: QWidget(parent, fl)
{}
IplImageWidget::~IplImageWidget()
{}
void IplImageWidget::initWidget(CvCapture* video)
{
double h=cvGetCaptureProperty(video,CV_CAP_PROP_FRAME_HEIGHT);
double w=cvGetCaptureProperty(video,CV_CAP_PROP_FRAME_WIDTH);
qimage = QImage(QSize(w,h), QImage::Format_RGB888);
qimage1 = QImage(QSize(w,h), QImage::Format_RGB888);
opencvimg = cvCreateImageHeader(cvSize(qimage.width(),qimage.height()),8,3);
opencvimg1 = cvCreateImageHeader(cvSize(qimage1.width(),qimage1.height()),8,1);
opencvimg->imageData = (char*)qimage.bits();
opencvimg1->imageData = (char*)qimage1.bits();
}
void IplImageWidget::PutImage(IplImage* img)
{
if(img->nChannels==1)
{
cvCopy(img, opencvimg1, 0);
cvCvtColor(opencvimg1,opencvimg,CV_GRAY2RGB);
}
else if(img->nChannels==3)
{
cvCopy(img, opencvimg, 0);
cvCvtColor(opencvimg,opencvimg,CV_BGR2RGB);
}
}
void IplImageWidget::paintEvent(QPaintEvent*)
{
QPainter painter(this);
if(!qimage.isNull())
painter.drawImage(QPoint(x(),y()), qimage.scaled(QSize(width(),height())));
}
и код ниже, который посылает картинку в виджет:
....
ui->wFrames->initWidget(video);
....
IplImage *originalImg=cvQueryFrame(video);
if(originalImg)
{
ui->wFrames->PutImage(originalImg);
}
.....
Вышеописанный код работает - картинка выводится.
Но если я вместо wFrames напишу wFrames2 - то картинка не будет выводиться.