一、函數(shù)介紹
OpenCV 是一個(gè)開(kāi)源的計(jì)算機(jī)視覺(jué)庫(kù),它包含了許多用于圖像處理和計(jì)算機(jī)視覺(jué)任務(wù)的函數(shù)。其中,imsave() 函數(shù)是 OpenCV 中的一個(gè)非常有用的函數(shù),它可以讓程序?qū)⑻幚砗蟮膱D像數(shù)據(jù)保存到指定的文件中。
二、函數(shù)原型
bool imwrite(const String& filename, InputArray image, const std::vector<int>& params);
其中,
filename 參數(shù)表示要保存的文件名
image 參數(shù)表示要保存的圖像數(shù)據(jù)
params 可選參數(shù)表示保存圖像使用的參數(shù)
params 使用說(shuō)明:
該參數(shù)需要按照參數(shù)id+參數(shù)值成對(duì)出現(xiàn),可以出現(xiàn)多對(duì)參數(shù)值(比如 (paramId_1, paramValue_1, paramId_2, paramValue_2, ...)),但必須保證這些參數(shù)對(duì)是相關(guān)的,比如保存JPG圖像時(shí),只能使用和JPEG相關(guān)的參數(shù)ID進(jìn)行組合使用。
可以使用的參數(shù)Id可以參考cv::ImwriteFlags。
cv::ImwriteFlags是一個(gè)枚舉類型,用于指定圖像寫(xiě)入時(shí)的壓縮和質(zhì)量選項(xiàng)。它包含了以下幾個(gè)成員:
cv::IMWRITE_JPEG_QUALITY:設(shè)置JPEG圖像的質(zhì)量,范圍為0到100,數(shù)值越高質(zhì)量越好,但文件大小也會(huì)相應(yīng)增加。
cv::IMWRITE_PNG_COMPRESSION:設(shè)置PNG圖像的壓縮級(jí)別,范圍為0(無(wú)壓縮)到9(最大壓縮),數(shù)值越小壓縮率越高,但文件大小也會(huì)相應(yīng)增加。
cv::IMWRITE_PXM_BINARY:將PXM圖像保存為二進(jìn)制格式,不進(jìn)行任何壓縮。
cv::IMWRITE_PXM_FORMAT:設(shè)置PXM圖像的格式,可以是ASCII或二進(jìn)制。
cv::IMWRITE_UNCHANGED:如果圖像已經(jīng)是原始格式(如BGR),則不進(jìn)行任何轉(zhuǎn)換。
cv::IMWRITE_ANYDEPTH:如果圖像具有不同的深度(例如,一個(gè)是8位深度,另一個(gè)是16位深度),則將其視為具有相同深度的圖像。
cv::IMWRITE_ANY_COLOR:如果圖像具有不同的顏色空間(例如,一個(gè)是BGR,另一個(gè)是HSV),則將其視為具有相同顏色空間的圖像。
cv::IMWRITE_ANY_MASK:如果圖像具有不同的掩碼(例如,一個(gè)是3通道,另一個(gè)是4通道),則將其視為具有相同掩碼的圖像。
cv::IMWRITE_ANY_DEPTH:如果圖像具有不同的深度(例如,一個(gè)是8位深度,另一個(gè)是16位深度),則將其視為具有相同深度的圖像。
cv::IMWRITE_ANY_INTERPOLATION:如果圖像具有不同的插值方法(例如,一個(gè)是線性插值,另一個(gè)是雙線性插值),則將其視為具有相同插值方法的圖像。
cv::IMWRITE_ANY_BILINEAR:如果圖像具有不同的雙線性插值方法(例如,一個(gè)是普通雙線性插值,另一個(gè)是超級(jí)雙線性插值),則將其視為具有相同雙線性插值方法的圖像。
cv::IMWRITE_ANY_HALF:如果圖像具有不同的半精度浮點(diǎn)數(shù)表示方法(例如,一個(gè)是16位浮點(diǎn)數(shù),另一個(gè)是32位浮點(diǎn)數(shù)),則將其視為具有相同半精度浮點(diǎn)數(shù)表示方法的圖像。
cv::IMWRITE_ANY_VECTOR:如果圖像具有不同的向量表示方法(例如,一個(gè)是整數(shù)向量,另一個(gè)是浮點(diǎn)向量),則將其視為具有相同向量表示方法的圖像。
cv::IMWRITE_ANY_RGB:如果圖像具有不同的RGB分量順序(例如,一個(gè)是BGR,另一個(gè)是RGB),則將其視為具有相同RGB分量順序的圖像。
cv::IMWRITE_ANY_STREAM:如果圖像具有不同的數(shù)據(jù)流格式(例如,一個(gè)是內(nèi)存流,另一個(gè)是文件流),則將其視為具有相同數(shù)據(jù)流格式的圖像。
三、函數(shù)使用的場(chǎng)景
保存圖像到本地文件系統(tǒng)
使用 imwrite() 函數(shù)可以將處理后的圖像數(shù)據(jù)保存到本地文件系統(tǒng)中。例如,可以使用 imwrite() 函數(shù)將一張 JPG 或 PNG 格式的圖片保存到本地文件系統(tǒng)中:
Mat image = ...; // 處理后的圖像數(shù)據(jù)
string filename = "test.jpg"; // 要保存的文件名
imwrite(filename, image); // 將圖像數(shù)據(jù)保存到本地文件系統(tǒng)中
保存圖像時(shí)通過(guò)params設(shè)置來(lái)控制圖像質(zhì)量
下是一些使用OpenCV的imwrite函數(shù)的params參數(shù)的案例:
保存為JPEG格式的圖片,質(zhì)量為90(默認(rèn)值為75):
std::vector<int> params = {cv::IMWRITE_JPEG_QUALITY, 90};
cv::imwrite("image.jpg", image, params);
保存為PNG格式的圖片,壓縮級(jí)別為6(默認(rèn)值為-1):
std::vector<int> params = {cv::IMWRITE_PNG_COMPRESSION, 6};
cv::imwrite("image.png", image, params);
保存圖像到內(nèi)存緩沖區(qū)
有時(shí)候,需要將圖像數(shù)據(jù)保存到內(nèi)存緩沖區(qū)中進(jìn)行進(jìn)一步處理。這時(shí),可以使用 imencode() 函數(shù)將圖像數(shù)據(jù)編碼為字節(jié)流,然后再使用 imdecode() 函數(shù)將字節(jié)流解碼為 Mat 對(duì)象:
vector<uchar> buffer; // 存儲(chǔ)圖像數(shù)據(jù)的緩沖區(qū)
Mat image = ...; // 處理后的圖像數(shù)據(jù)
imencode(".jpg", image, buffer); // 將圖像數(shù)據(jù)編碼為字節(jié)流
imdecode(buffer, IMREAD_COLOR); // 將字節(jié)流解碼為 Mat 對(duì)象
四、完整代碼實(shí)例
下面是一個(gè)完整的代碼示例,演示了如何使用 imwrite() 函數(shù)將處理后的圖像數(shù)據(jù)保存到本地文件系統(tǒng)中:文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-764532.html
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
Mat image = imread("test.jpg"); // 讀取本地文件中的圖像數(shù)據(jù)
if (image.empty()) {
cout << "Failed to open image file!" << endl;
return -1;
}
string filename = "output.jpg"; // 要保存的文件名
bool result = imwrite(filename, image); // 將圖像數(shù)據(jù)保存到本地文件系統(tǒng)中
if (result) {
cout << "Image saved successfully!" << endl;
} else {
cout << "Failed to save image!" << endl;
}
return 0;
}
五、總結(jié)
通過(guò)本文的介紹,我們了解了 OpenCV 中的 imwrite() 函數(shù)的基本用法和應(yīng)用場(chǎng)景。該函數(shù)可以幫助我們方便地將處理后的圖像數(shù)據(jù)保存到本地文件系統(tǒng)中,或者將其保存到內(nèi)存緩沖區(qū)中進(jìn)行進(jìn)一步處理。在實(shí)際開(kāi)發(fā)中,我們可以根據(jù)具體需求靈活運(yùn)用該函數(shù),提高開(kāi)發(fā)效率。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-764532.html
到了這里,關(guān)于[C++] opencv - imwrite函數(shù)介紹和使用場(chǎng)景的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!