回答
如果QImage的仍然存在,你只需要在其上進行快速操作,那麼您可以同時構建一個品種::使用QImage的內存
cv::Mat mat(image.rows(),image.cols(),CV_8UC3,image.scanline());
這是假設的QImage是3channels,即RGB888墊
如果QImage的是要離開,那麼你需要複製數據,請參見Qimage to cv::Mat convertion strange behaviour
如果QImage的是Format_ARGB32_Premultiplied(在參訪格式),那麼你需要將每個像素轉換爲OpenCV中的BGR佈局。 cv :: cvtcolor()函數可以將ARGB轉換爲最新版本的RGB。
或者你可以使用QImage::convertToformat()來複制數據
我是否必須使用scanLine遍歷圖像中的每個指針? – user1576633 2012-08-09 21:29:27
@ user1576633不,QImage連續存儲scanLine(),沒有arg,指向圖像數據的開始 – 2012-08-09 21:38:59
爲什麼不簡單地將這個墊子克隆到另一個,如果QImage消失? – 2013-08-16 10:57:24
我將圖像保存到磁盤,然後從CV重新打開它之前轉換爲RGB;)
@ ^我嘗試了以前的解決方案。它似乎沒有與我合作。雖然我得到了一些圖像,但它看起來像是一些條形碼信息的圖像。我想有一些參數不匹配。
你發出這個問題一年後有已經在互聯網上偉大的答案:
但我看到它的方式,如果你的工作與Qt和OpenCV在同一時間然後鍵入QImage
可能是僅用於顯示,這種情況下,您可能想要使用QPixmap
,因爲它的優化顯示。所以這是我做的:
- 加載圖像
cv::Mat
,如果你想顯示的圖像,使用的第二篇文章中介紹了非複製方法轉換爲QPixmap
。 - 做你的圖像處理
cv::Mat
。 - 在工作流程的任何時候,您都可以調用諸如
Mat2QPixmap()
之類的東西來獲得實時結果。 - 永遠不要將
QPixmap
轉換爲cv::Mat
,考慮到每種類型的目的,沒有任何意義。
我在OpenCV的3.1+風格代碼嘗試:
void qimage_to_mat(const QImage& image, cv::OutputArray out) {
switch(image.format()) {
case QImage::Format_Invalid:
{
Mat empty;
empty.copyTo(out);
break;
}
case QImage::Format_RGB32:
{
Mat view(image.height(),image.width(),CV_8UC4,(void *)image.constBits(),image.bytesPerLine());
view.copyTo(out);
break;
}
case QImage::Format_RGB888:
{
Mat view(image.height(),image.width(),CV_8UC3,(void *)image.constBits(),image.bytesPerLine());
cvtColor(view, out, COLOR_RGB2BGR);
break;
}
default:
{
QImage conv = image.convertToFormat(QImage::Format_ARGB32);
Mat view(conv.height(),conv.width(),CV_8UC4,(void *)conv.constBits(),conv.bytesPerLine());
view.copyTo(out);
break;
}
}
}
void mat_to_qimage(cv::InputArray image, QImage& out)
{
switch(image.type())
{
case CV_8UC4:
{
Mat view(image.getMat());
QImage view2(view.data, view.cols, view.rows, view.step[0], QImage::Format_ARGB32);
out = view2.copy();
break;
}
case CV_8UC3:
{
Mat mat;
cvtColor(image, mat, COLOR_BGR2BGRA); //COLOR_BGR2RGB doesn't behave so use RGBA
QImage view(mat.data, mat.cols, mat.rows, mat.step[0], QImage::Format_ARGB32);
out = view.copy();
break;
}
case CV_8UC1:
{
Mat mat;
cvtColor(image, mat, COLOR_GRAY2BGRA);
QImage view(mat.data, mat.cols, mat.rows, mat.step[0], QImage::Format_ARGB32);
out = view.copy();
break;
}
default:
{
throw invalid_argument("Image format not supported");
break;
}
}
}
- 1. 如何將opencv cv :: Mat轉換爲qimage
- 2. 將Qimage轉換爲Mat時出錯opencv
- 3. 將BufferedImage轉換爲OpenCv Mat
- 4. 將uchar Mat轉換爲OpenCV中的Mat?
- 5. 使用QImage :: loadFromData將cv :: mat轉換爲QImage
- 6. cv :: Mat到QImage的轉換
- 7. 如何將從/到QImage的ROI轉換爲/從cv :: Mat?
- 8. 如何將灰度/二進制Mat轉換爲QImage?
- 9. Qimage cv :: Mat轉換奇怪的行爲
- 10. OpenCV Mat到JavaCV Mat轉換
- 11. 將OpenCV的cv :: Mat轉換爲Eigen
- 12. 將BufferedImage轉換爲OpenCV中的Mat
- 13. 將PXCImage轉換爲OpenCV Mat(PIXEL_FORMAT_YUY2)
- 14. 將mat轉換爲iplimage *在opencv中
- 15. OpenCV Android - 將MatOfPoint轉換爲Mat
- 16. 將字符數組轉換爲Opencv Mat
- 17. 將RGB數組轉換爲Mat(OpenCv)
- 18. 通過opencv將Mat轉換爲位圖
- 19. 將OpenCV Mat對象轉換爲BufferedImage
- 20. openCV將Mat轉換爲灰度圖像
- 21. opencv:將Mat轉換爲IplImage問題
- 22. 將OpenGL紋理轉換爲OpenCV Mat
- 23. 將Android預覽幀轉換爲OpenCV Mat
- 24. 在Java中將BufferedImage轉換爲Mat(OpenCV)
- 25. 通過使用原始數據將QImage轉換爲cv :: Mat
- 26. 將mat矢量轉換爲mat文件以便使用opencv svm
- 27. 將Qimage轉換爲cvMat 64FC3格式
- 28. 如何將QImage轉換爲QByteArray?
- 29. 如何將QDeclarativeItem轉換爲QImage
- 30. 如何將QVideoFrame轉換爲QImage
這裏是一個[可能重複(http://stackoverflow.com/questions/11170485/qimage-to-cvmat-convertion-strange -behaviour) – SuperSaiyan 2012-08-09 15:21:04
@Thrustmaster - 不是一個愚蠢的事情,只是步驟問題走向另一個方向 – 2012-08-09 15:32:44