QImage和cv Mat的相互轉換

2021-10-12 00:26:21 字數 2798 閱讀 5325

一、實現思路

qimage和cv::mat的畫素資料都是儲存在堆上的uchar陣列中,詳情見《cv::mat的記憶體結構與訪問》。因此實現qimage和cv::mat的相互轉換,只需要拷貝堆上的uchar陣列即可。

二、c++**實現淺拷貝

todo: 淺拷貝注意事項與c++**

三、c++**實現深拷貝

1)ly_opencv_qt_utils.hpp

/*

* filename: ly_opencv_qt_utils.hpp

* author: l.y.

* contact: [email protected]

* brief: opencv和qt的常用工具

* dependencies: c++11, opencv2, qt5

* update log:

* 1) 20201212 v1.0.0

* 1, 初次版本。

* 2) 20201213 v1.0.1

* 1, debug: 使用指標初始化qimge時,未自定義記憶體清理函式。

* 3) 20201221 v1.1.0

* 1, 功能增加:支援四通道的影象。

* todo:

*/#ifndef ly_opencv_qt_utils_hpp

#define ly_opencv_qt_utils_hpp

#include

#include

namespace ly ;}

// namespace

#endif

// ly_opencv_qt_utils_hpp

2)ly_opencv_qt_utils.cpp

/*

* filename: ly_opencv_qt_utils.cpp

* author: l.y.

* contact: [email protected]

* brief: opencv和qt的常用工具

* dependencies: c++11, opencv2, qt5

* update log:

* 1) 20201212 v1.0.0

* 1, 初次版本。

* 2) 20201213 v1.0.1

* 1, debug: 使用指標初始化qimge時,未自定義記憶體清理函式。

* 3) 20201221 v1.1.0

* 1, 功能增加:支援四通道的影象。

* todo:

*/#include

"ly_opencv_qt_utils.hpp"

#include

//#include "../ly_message_logger/ly_message_logger.hpp"

namespace ly

qimage::format format;

switch

(image.

type()

)

size_t data_size = image.rows * image.cols * image.step[1]

; uchar* data =

new uchar[data_size];if

(image.

iscontinuous()

)else

} qimage qimage

(data,

image.cols,

image.rows,

static_cast

<

int>

(image.cols * image.step[1]

), format,

(void

* p)

, data);if

(swap_rgb && image.step[1]

!=1)else

}cv::mat lyopencvqtutils::

tocvmat

(const qimage &image,

bool swap_rgb)

qimage temp_image = image;

if(swap_rgb && bytes_per_pix !=1)

size_t data_size = temp_image.

height()

* temp_image.

width()

* bytes_per_pix;

uchar* data =

new uchar[data_size];if

(temp_image.

bytesperline()

== temp_image.

width()

* bytes_per_pix)

else

}return cv::

mat(temp_image.

height()

, temp_image.

width()

, type,

data,

temp_image.

width()

* bytes_per_pix);}

}// namespace

QImage 與 cv Mat 之間的相互轉換

最近做影象處理方面的專案比較多,很多演算法自己從頭寫的話太浪費時間,而且自己寫的也不一定完善,早就聽說opencv 在影象處理演算法方面功能很強大,一直沒時間學習,這次正好專案用到了,臨時抱佛腳學習些 opencv 入門知識。因為我的程式介面都是用 qt寫的,因此也花了點時間研究了如何將 openc...

QImage 與 cv Mat 之間的相互轉換

近期做影象處理方面的專案比較多,非常多演算法自己從頭寫的話太浪費時間,並且自己寫的也不一定完好,早就聽說opencv 在影象處理演算法方面功能非常強大,一直沒時間學習,這次正好專案用到了。暫時抱佛腳學習些 opencv 入門知識。由於我的程式介面都是用 qt寫的,因此也花了點時間研究了怎樣將 ope...

CvMat 和cv Mat之間的區別

cv mat是乙個類 class 而cvmat是乙個struct,從型別上就可以知道二者存在很大區別。前者除了幾個成員變數之外還有很多的成員函式和過載函式,可以實現很多的影象資料處理功能,而後者只有幾個成員變數,要對其成員進行一些處理,需要借用別的函式。typedef struct cvmat da...