我想創建一個應用程序,我試圖整合opencv和qt。Qimage cv :: Mat轉換奇怪的行爲
我成功地設法通過使用下面的代碼簡歷::墊QImage的轉換:
void MainWindow::loadFile(const QString &fileName)
{
cv::Mat tmpImage = cv::imread(fileName.toAscii().data());
cv::Mat image;
if(!tmpImage.data || tmpImage.empty())
{
QMessageBox::warning(this, tr("Error Occured"), tr("Problem loading file"), QMessageBox::Ok);
return;
}
/* Mat to Qimage */
cv::cvtColor(tmpImage, image, CV_BGR2RGB);
img = QImage((const unsigned char*)(image.data), image.cols, image.rows, QImage::Format_RGB888);
imgLabel->setPixmap(QPixmap::fromImage(img));
imgLabel->resize(imgLabel->pixmap()->size());
saveAsAct->setEnabled(true);
}
然而,當我試圖通過使用下面的代碼到的QImage轉換爲CV ::墊:
bool MainWindow::saveAs()
{
if(fileName.isEmpty())
{
QMessageBox::warning(this, tr("Error Occured"), tr("Problem loading file"), QMessageBox::Close);
return EXIT_FAILURE;
}else{
outputFileName = QFileDialog::getSaveFileName(this, tr("Save As"), fileName.toAscii().data(), tr("Image Files (*.png *.jpg *.jpeg *.bmp)\n *.png\n *.jpg\n *.jpeg\n *.bmp"));
/* Qimage to Mat */
cv::Mat mat = cv::Mat(img.height(), img.width(), CV_8UC4, (uchar*)img.bits(), img.bytesPerLine());
cv::Mat mat2 = cv::Mat(mat.rows, mat.cols, CV_8UC3);
int from_to[] = {0,0, 1,1, 2,2};
cv::mixChannels(&mat, 1, &mat2, 1, from_to, 3);
cv::imwrite(outputFileName.toAscii().data(), mat);
}
saveAct->setEnabled(true);
return EXIT_SUCCESS;
}
我沒有成功,結果是完全無序的圖像。在我搜索的網絡中,我看到人們使用這種方式而沒有提到任何具體問題。有人有任何想法,關於可能導致問題的原因?提前致謝。
Theoodore
P.S.我使用的OpenCV 2.4和Qt 4.8,一個Arch Linux的系統下使用gnome-3.4
我改變了代碼 「CV ::墊QImage的」 到 CV :: cvtColor(tmpImage,圖像,CV_BGR2RGB); uchar * buffer = image.ptr(); img = QImage(buffer,image.cols,image.rows,image.step,QImage :: Format_RGB888); imgLabel-> setPixmap(QPixmap :: fromImage(img)); imgLabel-> resize(imgLabel-> pixmap() - > size()); 但它似乎沒有任何影響。我認爲的問題是如何正確地將「QImage」轉換爲cv :: Mat。 – ThT
不,你必須循環遍歷所有行,一次複製一個,因爲它們不一定是連續的格式之一,請參閱鏈接中的代碼 –