目錄
- 1. 函式定義
- 2. 示例
- 3. 使用場景
- 4. 效能
- 5. 注意事項
cv::Mat::setTo()
是 OpenCV 中用於將矩陣中的所有元素設定為一個給定的值。它可以應用於整個矩陣,也可以透過掩碼 (mask) 僅對部分矩陣進行操作。這個函式常用於影像處理中的多種場景,例如影像填充、區域修改等。
1. 函式定義
Mat& Mat::setTo(const Scalar& value, InputArray mask = noArray());
引數:
value
: 這是一個cv::Scalar
值,它指定要設定的值。Scalar
可以是一個多通道值,因此可以用於設定彩色影像的畫素值。mask
: 可選引數。它是一個與矩陣大小相同的單通道二值掩碼(mask
)。只有掩碼中非零的元素對應的矩陣位置會被設定為指定的值。如果不提供掩碼,函式會對整個矩陣的所有元素應用操作。
返回值:
- 返回引用的是原矩陣,應用完設定操作後的矩陣本身。
2. 示例
-
應用於整個矩陣
cv::Mat img = cv::Mat::zeros(300, 300, CV_8UC3); // 建立一個黑色的 300x300 彩色影像 img.setTo(cv::Scalar(0, 255, 0)); // 將影像所有畫素設定為綠色
-
使用掩碼進行部分設定
cv::Mat img = cv::Mat::zeros(300, 300, CV_8UC3); // 建立一個黑色的 300x300 彩色影像 cv::Mat mask = cv::Mat::zeros(300, 300, CV_8UC1); // 建立一個黑色的掩碼 mask(cv::Rect(100, 100, 100, 100)) = 255; // 掩碼中一個 100x100 區域設定為白色 img.setTo(cv::Scalar(0, 0, 255), mask); // 僅將掩碼區域的影像畫素設定為紅色
3. 使用場景
- 影像填充: 可以使用
setTo()
快速將整幅影像或某個區域填充為指定的顏色或灰度值。 - 掩碼操作: 結合掩碼,可以對影像的某些特定區域進行修改,而不影響其他區域。這種操作在影像分割、區域感興趣(ROI)處理等場景中非常有用。
- 初始化影像: 在初始化影像時,例如建立一幅全零影像或者全特定顏色的影像時,
setTo()
是一個簡便的工具。
4. 效能
setTo()
的效能非常高效,因為它是透過 SIMD(Single Instruction Multiple Data) 指令集進行矩陣操作的,因此非常適合處理大規模影像資料。
5. 注意事項
- 當使用掩碼時,掩碼必須是單通道的影像,並且其大小應與目標矩陣的大小一致。
cv::Scalar
是一個四通道的容器,即使對於單通道影像,它的未使用通道也需要顯式設定為零。
總結來說,cv::Mat::setTo()
是一個功能強大且靈活的函式,用於快速設定矩陣中的元素,並可以與掩碼結合以實現複雜的區域處理。