OpenCV mask的作用及如何制作掩模mask
前言
OpenCV中的很多函數(shù)用到mask,mask是什么?怎么作一個mask?將是本文的主要內(nèi)容。
一、mask是什么?
mask 不是馬斯克,是掩膜,可以用來遮蓋非感興趣區(qū),突出感興趣區(qū),使得圖像處理只專注于ROI部分。
二、OpenCV生成mask的幾種方法
注意:mask最終需要與要作用到的輸入圖像的尺寸與類型保持一致
矩形
#include <opencv2/opencv.hpp> using namespace cv; int main() { Mat src = imread("img1.png", IMREAD_GRAYSCALE); imshow("src", src); // 定義mask,大小640*480,像素全0 Mat mask = cv::Mat::zeros(Size(640, 480), CV_8UC1); // 作一個從坐標(220,120),寬200,高200的矩形框,框內(nèi)填充白色,從方法1,2,3中任選一 // 方法1 rectangle(mask, cv::Rect(220, 120, 200, 200), Scalar(255), -1); // 方法2 mask(cv::Rect(320, 50, 240, 310)) = 255; // 方法3 mask(cv::Rect(320, 50, 240, 310)).setTo(255); Mat dst; // 將src中對應對應掩膜ROI中區(qū)域拷貝到dst src.copyTo(dst, mask); imshow("mask",mask); imshow("dst", dst); waitKey(); return 0; }
運行結(jié)果如下:
src
mask
dst
圓形
同理
#include <opencv2/opencv.hpp> using namespace cv; int main() { Mat src = imread("img1.png", IMREAD_GRAYSCALE); // 定義mask,大小640*480,像素全0 Mat mask = cv::Mat::zeros(Size(640, 480), CV_8UC1); // 作一個以點坐標(320,50)為圓心,150為半徑的圓,圓內(nèi)填充白色 circle(mask, Point(440, 205), 150, Scalar(255),-1); Mat dst; // 將src中對應對應掩膜ROI中區(qū)域拷貝到dst src.copyTo(dst, mask); imshow("mask",mask); imshow("dst", dst); waitKey(); return 0; }
mask
dst
mask可以是各種形狀,各式各樣,方法也有很多,這里只略舉一二。
總結(jié)
定義mask,設置ROI,將ROI內(nèi)部填充白色,其他填充黑色,即可對ROI區(qū)域操作,遮蓋其他區(qū)域。也可以將mask反轉(zhuǎn),遮蓋矩形框內(nèi)數(shù)據(jù),處理框外數(shù)據(jù)。
到此這篇關(guān)于OpenCV mask的作用及如何制作掩模mask的文章就介紹到這了,更多相關(guān)OpenCV mask掩模內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C/C++?Qt?TabWidget?實現(xiàn)多窗體創(chuàng)建詳解
TabWidget組件配合自定義Dialog組件,可實現(xiàn)一個復雜的多窗體分頁結(jié)構(gòu)。這篇文章就主要介紹了如何通過TabWidget實現(xiàn)多窗體的創(chuàng)建,感興趣的小伙伴可以了解一下2021-12-12C++基于QWidget和QLabel實現(xiàn)圖片縮放,拉伸與拖拽
這篇文章主要為大家詳細介紹了C++如何基于QWidget和QLabel實現(xiàn)圖片縮放、拉伸與拖拽等功能,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起學習一下2024-02-02