我正在使用QtCreator开发OpenCV3.0中的Surf检测算法。
我正在使用鼠标事件裁剪QLabel上显示的QImage。所以我可以将裁剪后的图像与实时网络摄像头进行比较
我的问题是,当我将QImage转换为Mat Image时,它的效果非常好。
但是当我尝试将裁剪的QImage转换为Mat Image时,我的输出图像完全奇怪。
这是我的Mouseevent代码:
void surf_detection::mousePressEvent(QMouseEvent *ev)
{
if(ui->label_2->underMouse()){
// cout <<"Entered Press"<<endl;
origin = ev->pos();
//if (!rubberBand)
rubberBand = new QRubberBand(QRubberBand::Rectangle, this);
rubberBand->show();
}
}
void surf_detection::mouseMoveEvent(QMouseEvent *ev)
{
if(ui->label_2->underMouse()){
rubberBand->setGeometry(QRect(origin, ev->pos()).normalized());
// cout <<"Entered Move"<<endl;
}
}
void surf_detection::mouseReleaseEvent(QMouseEvent *ev)
{
if(ui->label_2->underMouse()){
QPoint a = mapToGlobal(origin);
QPoint b = ev->globalPos();
a = ui->label_2->mapFromGlobal(a);
b = ui->label_2->mapFromGlobal(b);
rubberBand->hide();
QPixmap OriginalPix(*ui->label_2->pixmap());
double sx = ui->label_2->rect().width();
double sy = ui->label_2->rect().height();
sx = OriginalPix.width() / sx;
sy = OriginalPix.height() / sy;
a.setX(int(a.x() * sx));
b.setX(int(b.x() * sx));
a.setY(int(a.y() * sy));
b.setY(int(b.y() * sy));
QRect myRect(a,b);
QImage newImage;
newImage = OriginalPix.toImage();
copyImage = newImage.copy(myRect);
ui->label_2->setScaledContents(true);
ui->label_2->setPixmap(QPixmap::fromImage(copyImage));
ui->label_2->repaint();
}
这里copyImage是一个成员变量,我打算用它来进行SURF检测。
My QImage to Mat图片代码:
UMat surf_detection::QImagetocv(QImage img){
Mat tmp(img.height(),img.width(),CV_8UC3,
(uchar*)img.bits(),img.bytesPerLine());
UMat con;
tmp.copyTo(con);
UMat result;
cvtColor(con,result,CV_BGR2RGB);
return result;
}
我不明白转换在哪里出错了。 评论赞赏!
我在这附上了一张奇怪输出的照片 Output image.