在ROS中結(jié)合OpenCV使用時(shí),cv::imread() 函數(shù)并非ROS本身的API,而是來自O(shè)penCV庫的函數(shù),用于讀取本地磁盤上的圖像文件。
其用法如下:
cv::Mat cv::imread(const string& filename, int flags = IMREAD_COLOR);
參數(shù)說明:
????filename:字符串類型,表示要讀取的圖像文件的完整路徑和名稱。
????flags:整型變量,定義了讀取圖像的方式,可選值包括:
????????IMREAD_UNCHANGED 或 -1:加載圖像,包括alpha通道(如果存在)。
????????IMREAD_GRAYSCALE 或 0:以灰度模式加載圖像。
????????IMREAD_COLOR 或 1:默認(rèn)選項(xiàng),以彩色模式加載圖像(如果是彩色圖像)。
????????IMREAD_ANYDEPTH:加載任意深度圖像作為單通道圖像。
????????IMREAD_ANYCOLOR:加載任何顏色空間的圖像。
可以將上述標(biāo)志進(jìn)行組合,例如 IMREAD_GRAYSCALE | IMREAD_ANYDEPTH 將加載一個(gè)可能包含高動(dòng)態(tài)范圍數(shù)據(jù)的灰度圖像。
返回值:
cv::Mat 類型的對(duì)象,代表所讀取的圖像數(shù)據(jù)。如果沒有成功讀取圖像,則返回一個(gè)空矩陣(即 .empty() 返回 true)。
彩色圖像使用 OpenCV 加載時(shí)是 BGR 模式。
示例代碼:
#include <opencv2/opencv.hpp>
#include <ros/ros.h>
int main(int argc, char** argv)
{
????ros::init(argc, argv, "image_reader");
????ros::NodeHandle nh;
????// 讀取圖像文件
????cv::Mat image = cv::imread("/home/user/path/to/image.jpg", cv::IMREAD_COLOR);
????if (image.empty())
????{
????????ROS_ERROR("Could not read the image file.");
????????return -1;
????}
????// 顯示圖像
????cv::imshow("Image Window", image);
????cv::waitKey(0); // 等待用戶按鍵,窗口才會(huì)關(guān)閉
????return 0;
}
在ROS環(huán)境下,通常會(huì)結(jié)合cv_bridge來處理ROS Image消息與OpenCV Mat之間的轉(zhuǎn)換,而不僅僅是讀取本地文件。如果是在ROS節(jié)點(diǎn)內(nèi)部操作攝像頭獲取的圖像,那么需要從ROS話題訂閱圖像數(shù)據(jù),并通過cv_bridge的imgmsg_to_cv2()函數(shù)將其轉(zhuǎn)換為OpenCV可以處理的cv::Mat格式。
cv::imwrite() 函數(shù)同樣是來自O(shè)penCV庫的函數(shù),用于將圖像數(shù)據(jù)保存到本地磁盤上的文件??梢允褂眠@個(gè)函數(shù)來保存攝像頭捕獲的圖像或者處理后的圖像。使用函數(shù) cv2.imwrite() 來保存一個(gè)圖像。(首先需要一個(gè)文件名,之后才是要保存的圖像。)
其用法如下:
cv::imwrite(const string& filename, InputArray img, const std::vector<int>& params = std::vector<int>());
參數(shù)說明:
????filename:字符串類型,表示要寫入圖像文件的完整路徑和名稱,包括擴(kuò)展名,根據(jù)擴(kuò)展名來確定輸出圖像的格式。
????img:cv::Mat 類型的對(duì)象或其他符合 InputArray 類型要求的圖像數(shù)據(jù)結(jié)構(gòu),這是要保存的圖像內(nèi)容。
? ? params:可選參數(shù),一個(gè)整數(shù)類型的向量,用于指定編碼器特定的參數(shù)或選項(xiàng)??蛇x參數(shù),用于指定圖像壓縮編碼格式和壓縮級(jí)別。
例如,在寫入JPEG格式圖像時(shí)可以設(shè)置壓縮質(zhì)量等。如果不需要特殊設(shè)置,則可以不提供此參數(shù),此時(shí)默認(rèn)為一個(gè)空的整數(shù)向量。
示例代碼:
#include <iostream>
#include <opencv2/opencv.hpp>
int main()
{
????// 讀取圖像
????cv::Mat img = cv::imread("input.jpg");
????if (img.empty())
????{
????????std::cout << "無法讀取圖像" << std::endl;
????????return -1;
????}
????// 保存圖像
????bool result = cv::imwrite("output.jpg", img);
????if (result)
????{
????????std::cout << "圖像保存成功" << std::endl;
????}
????else
????{
????????std::cout << "圖像保存失敗" << std::endl;
????}
????return 0;
}
imshow()函數(shù)用于在窗口中顯示圖像。(窗口會(huì)自動(dòng)調(diào)整為圖像大小。第一個(gè)參數(shù)是窗口的名字,其次才是需要的圖像。)
其用法如下:
void imshow(const String& winname, const Mat& image);??
參數(shù)說明:
winname:字符串類型,表示要顯示圖像的窗口名稱。如果該窗口尚不存在,則會(huì)創(chuàng)建一個(gè)新的窗口。 ???
image:要顯示的圖像,通常是一個(gè)Mat對(duì)象。
示例代碼:
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
????// 讀取圖像
????Mat image = imread("example.jpg");
????// 檢查圖像是否正確讀取
????if (image.empty())
????{
????????cout << "無法讀取圖像" << endl;
????????return -1;
????}
????// 創(chuàng)建一個(gè)名為"Example Image"的窗口
????namedWindow("Example Image", WINDOW_AUTOSIZE);
????// 在窗口中顯示圖像
????imshow("Example Image", image);
????// 等待按鍵,然后關(guān)閉窗口
????waitKey(0);
????destroyAllWindows();
????return 0;
}
在這個(gè)示例中,首先包含了必要的頭文件,然后定義了一個(gè)名為main的函數(shù)。在main函數(shù)中,使用imread函數(shù)讀取了一張名為example.jpg的圖像,并將其存儲(chǔ)在Mat對(duì)象image中。
然后,使用namedWindow函數(shù)創(chuàng)建一個(gè)名為"Example Image"的窗口,并設(shè)置窗口大小自動(dòng)調(diào)整。最后,使用imshow函數(shù)在窗口中顯示圖像,并使用waitKey(0)等待用戶按下任意鍵,然后使用destroyAllWindows()關(guān)閉所有打開的窗口。
補(bǔ)充:cv2.waitKey() 是一個(gè)鍵盤綁定函數(shù)。需要指出的是它的時(shí)間尺度是毫秒級(jí)。函數(shù)等待特定的幾毫秒,看是否有鍵盤輸入。特定的幾毫秒之內(nèi),如果按下任意鍵,這個(gè)函數(shù)會(huì)返回按鍵的 ASCII 碼值,程序?qū)?huì)繼續(xù)運(yùn)行。如果沒有鍵盤輸入,返回值為 -1,如果我們?cè)O(shè)置這個(gè)函數(shù)的參數(shù)為 0,那它將會(huì)無限期的等待鍵盤輸入。文章來源:http://www.zghlxwxcb.cn/news/detail-785530.html
cv2.destroyAllWindows() 可以輕易刪除任何建立的窗口。如果想刪除特定的窗口可以使用 cv2.destroyWindow(),在括號(hào)內(nèi)輸入想刪除的窗口名。文章來源地址http://www.zghlxwxcb.cn/news/detail-785530.html
到了這里,關(guān)于ROS OpenCV 圖像基本處理函數(shù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!