OpenCV 3.4 Scalar 參數說明,與 CvType 結合使用

關於 JAVA 學習 OpenCV 的內容,函數講解。內容我均整理在 GitHubd的OpenCV3-Study-JAVAjava

咱們在學習OpenCV 時,發如今構造 Mat 時,會有2個關鍵參數,一個 CvType,一個 Scalar。不少人不明白這2個參數的意思,因此在把別人例子拿來使用或本身寫的的時候發現這個參數不知道該怎麼填。本文就將 Scalar 參數詳細的說明下。git

Scalar 是一個配合 CvType 使用的參數,若是你不瞭解 CvType,能夠先看看我寫的 OpenCV 3.4 讀懂 CvType 類型說明 瞭解什麼是圖像通道,CvType 的構造。github

本文下列實例均是 JAVA 代碼,其餘語言實現類同數組

Scalar 構造器

public class Scalar {
    public double[] val;

    public Scalar(double v0, double v1, double v2, double v3) {
        this.val = new double[]{v0, v1, v2, v3};
    }

    public Scalar(double v0, double v1, double v2) {
        this.val = new double[]{v0, v1, v2, 0.0D};
    }

    public Scalar(double v0, double v1) {
        this.val = new double[]{v0, v1, 0.0D, 0.0D};
    }

    public Scalar(double v0) {
        this.val = new double[]{v0, 0.0D, 0.0D, 0.0D};
    }

    public Scalar(double[] vals) {
        if (vals != null && vals.length == 4) {
            this.val = (double[])vals.clone();
        } else {
            this.val = new double[4];
            this.set(vals);
        }

    }

    .......
}

能夠看到有5個構造函數,參數也不復雜,很容易理解。除開 public Scalar(double[] vals) 這個數組入參的構造函數,其餘4個構造函數分別是傳入1個、2個、3個、4個 double 類型的構造函數,那麼這些參數表明什麼意思,他的取值範圍是什麼?函數

Scalar 參數的含義

Scalar 必定是與 CvType 結合使用的,他表明 CvType 中指定通道的值。若是您不瞭解 CvType,能夠先看看我寫的 OpenCV 3.4 讀懂 CvType 類型說明 瞭解什麼是圖像通道,CvType 的構造。學習

構造說明:this

  1. 構造函數的入參(值)的數量 <= 通道數量 [若是是2通道圖像,用4個參數的構造函數,後面2個參數不起做用]
  2. 構造函數的入參(值)的數量 < 通道數量 時,未傳入值的通道值爲0
  3. 多通道圖像時,入參順序 new Scalar(B,G,R,alpha)

下面來看示例:.net

import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Scalar;

import org.junit.Test;
import org.opencv.core.Size;

public class TestScalar {
    
    /**
     * 建立灰色圖像
     */
    @Test
    public void createGrayImage(){
        //選擇一個單通道類型 CV_8UC1
        //單通道下 0 爲黑,255爲白,取中間值 125 ,灰色。
        Mat sourceImage = new Mat(100,100, CvType.CV_8UC1, new Scalar(125));
        Imgcodecs.imwrite("savePath/gary-image.png",sourceImage);
    }

    /**
     * 建立藍色圖像
     */
    @Test
    public void createBlueImage(){
        //藍色爲彩色圖,因此通道類型爲3通道,CV_8UC3
        //藍色是 RGB 中的 B,其RGB值爲 R:0  ,  G:0  ,  B:255
        //Scalar 入參順序爲 new Scalar(B,G,R,A)。
        //new Scalar(255) 的意思爲 B 通道值爲255 ,G、R 值不傳遞的話,默認爲0

        Mat sourceImage = new Mat(100,100, CvType.CV_8UC3, new Scalar(255));
        Imgcodecs.imwrite("savePath/blue-image.png",sourceImage);
    }

    /**
     * 建立綠色圖像
     */
    @Test
    public void createGreenImage(){
        //綠色爲彩色圖,因此通道類型爲3通道,CV_8UC3
        //綠色是 RGB 中的  G,其RGB值爲 R:0  ,  G:255  ,  B:0
        //Scalar 入參順序爲 new Scalar(B,G,R,A)。
        //new Scalar(0,255) 的意思爲 B 通道值爲0,G通道值爲255,R 值不傳遞的話,默認爲0

        Mat sourceImage = new Mat(100,100, CvType.CV_8UC3, new Scalar(0,255));
        Imgcodecs.imwrite("savePath/green-image.png",sourceImage);
    }

    /**
     * 建立紅色圖像
     */
    @Test
    public void createRedImage(){
        //紅色爲彩色圖,因此通道類型爲3通道,CV_8UC3
        //紅色是 RGB 中的 R,其RGB值爲 R:255  ,  G:0  ,  B:0
        //Scalar 入參順序爲 new Scalar(B,G,R,A)。
        //new Scalar(0,0,255) 的意思爲 B 通道值爲 0,G 通道值爲 0,R 通道值爲 255

        Mat sourceImage = new Mat(100,100, CvType.CV_8UC3, new Scalar(0,0,255));
        Imgcodecs.imwrite("savePath/red-image.png",sourceImage);
    
    }


    /**
     * 建立透明圖像
     */
    @Test
    public void createAlphaImage(){
        //透明圖像爲4通道圖像,因此通道類型爲4通道,CV_8UC4
        //建立一個半透明的紅色圖像來試試
        //紅色是 RGB 中的 R,其RGB值爲 R:255  ,  G:0  ,  B:0
        //Scalar 入參順序爲 new Scalar(B,G,R,A)。
        //new Scalar(0,0,255,125) 的意思爲 B 通道值爲 0,G 通道值爲 0,R 通道值爲 255,Alpha 通道值爲125 (255爲不透明,0爲全透明會忽略全部的 RGB 顏色)

        Mat sourceImage = new Mat(100,100, CvType.CV_8UC4, new Scalar(0,0,255,125));
        Imgcodecs.imwrite("savePath/alpha-image.png",sourceImage);
    }
}

經過上邊的例子,應該已經明白 Scalar 的意思了吧,就是通道的值code

Scalar 參數的數據範圍

處理 Alpha 通道值爲 0~255 ,其餘通道取值範圍根據圖像的位數(Bite)來決定。能夠查看OpenCV 3.4 讀懂 CvType 類型說明 瞭解什麼是圖像通道,CvType 的構造,後面後各 Bite 下通道的取值範圍。blog

廣告欄: 歡迎關注個人 我的博客

相關文章
相關標籤/搜索