一、實現思路
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...