最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Android基于OpenCV實現(xiàn)非真實渲染

 更新時間:2021年06月18日 08:53:09   作者:易冬  
非真實感渲染(Non Photorealistic Rendering,簡稱NPR),是指利用計算機模擬各種視覺藝術(shù)的繪制風格,也用于發(fā)展新的繪制風格。比如模擬中國畫、水彩、素描、油畫、版畫等藝術(shù)風格。本文將講解Android基于OpenCV實現(xiàn)非真實渲染的方法

非真實渲染

非真實感渲染(Non Photorealistic Rendering,簡稱NPR),是指利用計算機模擬各種視覺藝術(shù)的繪制風格,也用于發(fā)展新的繪制風格。比如模擬中國畫、水彩、素描、油畫、版畫等藝術(shù)風格。NPR也可以把三維場景渲染出豐富的、特別的新視覺效果,使它具備創(chuàng)新的功能。NPR渲染以強烈的藝術(shù)形式應用在動畫、游戲等娛樂領(lǐng)域中,也出現(xiàn)在工程、工業(yè)設(shè)計圖紙中。廣闊的應用領(lǐng)域,不僅是由于它的藝術(shù)表現(xiàn)形式豐富多樣,還在于計算機能夠輔助完成原本工作量大、難度高的創(chuàng)作工作。 目前,基于三維軟件的NPR渲染器相當多,如FinalToon, Il-lustrator, Pencil等,同時還可以借用程序貼圖來創(chuàng)建NPR的材質(zhì),協(xié)助生成手繪風格的圖像效果;另外,像Mental Ray,Reyes,Brazil等外掛渲染器都是NPR渲染的解決方案

引用自【百度百科】

API

OpenCV給我們提供了四種非真實渲染的使用場景:邊緣保留濾波、細節(jié)增強、素描鉛筆畫、風格化。

邊緣保留濾波

public static void edgePreservingFilter(Mat src, Mat dst, int flags, float sigma_s, float sigma_r)
  • 參數(shù)一:src,輸入圖像,8位三通道。
  • 參數(shù)二:dst,輸出圖像,8位三通道。
  • 參數(shù)三:flags,邊緣保留標志位。
public static final int
        RECURS_FILTER = 1,
        NORMCONV_FILTER = 2;
  • 參數(shù)四:sigma_s,鄰域大小。取值0~200。
  • 參數(shù)五:sigma_r,鄰域內(nèi)被平均的顏色的不相近程度。取值0~1。

細節(jié)增強

public static void detailEnhance(Mat src, Mat dst, float sigma_s, float sigma_r)
  • 參數(shù)一:src,輸入圖像,8位三通道。
  • 參數(shù)二:dst,輸出圖像,8位三通道。
  • 參數(shù)三:sigma_s,鄰域大小。取值0~200。
  • 參數(shù)四:sigma_r,鄰域內(nèi)被平均的顏色的不相近程度。取值0~1。

素描鉛筆畫

public static void pencilSketch(Mat src, Mat dst1, Mat dst2, float sigma_s, float sigma_r, float shade_factor)
  • 參數(shù)一:src,輸入圖像,8位三通道。
  • 參數(shù)二:dst1,輸出圖像,8位單通道,即黑白素描。
  • 參數(shù)三:dst2,輸出圖像,大小類型與輸入圖像相同,即彩色素描。
  • 參數(shù)四:sigma_s,鄰域大小。取值0~200。
  • 參數(shù)五:sigma_r,鄰域內(nèi)被平均的顏色的不相近程度。取值0~1。
  • 參數(shù)六:shade_factor,強度縮放值。取值0~0.1

風格化

public static void stylization(Mat src, Mat dst, float sigma_s, float sigma_r) 
  • 參數(shù)一:src,輸入圖像,8位三通道。
  • 參數(shù)二:dst,輸出圖像,8位三通道。
  • 參數(shù)三:sigma_s,鄰域大小。取值0~200。
  • 參數(shù)四:sigma_r,鄰域內(nèi)被平均的顏色的不相近程度。取值0~1。

關(guān)于sigma_s和sigma_r:

sigma_s,即Sigma_Spatial,決定平滑量。sigma_r,即Sigma_Range,決定平均值。

典型的平滑濾波器將像素值替換為其相鄰像素的加權(quán)和。 鄰域越大,過濾后的圖像看起來越平滑。 鄰域的大小與參數(shù)sigma_s成正比。但是在邊緣保留濾波器里,有兩個關(guān)鍵點:1)平滑圖片;2)不平滑邊緣/顏色邊界。換句話說,我們就無法簡單地將像素值替換成鄰域像素的加權(quán)和。而是在鄰域內(nèi)選取和當前像素值相近的像素然后求取平均值,然后替換當前像素值的方式來避免上述問題。所以就需要兩個參數(shù)來明確范圍和顏色相似程度。

操作

/**
 * 非真實渲染
 *
 * @author yidong
 * @date 11/30/20
 */
class NonPhotoRealisticRenderingActivity : AppCompatActivity() {

    private lateinit var mRgb: Mat
    private val mBinding: ActivityNonPhotorealisticRenderingBinding by lazy {
        ActivityNonPhotorealisticRenderingBinding.inflate(layoutInflater)
    }

    private var sigmaR = 10f
        set(value) {
            field = when {
                value > 200f -> {
                    200f
                }
                value < 0f -> {
                    200f
                }
                else -> {
                    value
                }
            }
            mBinding.tvSigmaR.text = sigmaR.toInt().toString(10)
        }
    private var sigmaS = 0.1f
        set(value) {
            field = when {
                value > 1.0f -> {
                    1.0f
                }
                value < 0f -> {
                    0f
                }
                else -> {
                    value
                }
            }
            mBinding.tvSigmaS.text = String.format("%.1f", sigmaS)
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(mBinding.root)

        mRgb = Mat()
        val bgr = Utils.loadResource(this, R.drawable.cow)
        Imgproc.cvtColor(bgr, mRgb, Imgproc.COLOR_BGR2RGB)
        mBinding.ivLena.showMat(mRgb)
    }


    private fun doEdgePreservingFilter(flag: Int) {
        val dst = Mat()
        mBinding.isLoading = true
        GlobalScope.launch(Dispatchers.IO) {
            Photo.edgePreservingFilter(mRgb, dst, flag, sigmaR, sigmaS)
            launch(Dispatchers.Main) {
                mBinding.isLoading = false
                mBinding.ivResult.showMat(dst)
            }
        }
    }

    private fun doDetailEnhance() {
        val dst = Mat()
        mBinding.isLoading = true
        GlobalScope.launch(Dispatchers.IO) {
            Photo.detailEnhance(mRgb, dst, sigmaR, sigmaS)
            launch(Dispatchers.Main) {
                mBinding.isLoading = false
                mBinding.ivResult.showMat(dst)
            }
        }
    }


    private fun doPencilSketch() {
        val dst1 = Mat()
        val dst2 = Mat()
        mBinding.isLoading = true
        GlobalScope.launch(Dispatchers.IO) {
            Photo.pencilSketch(mRgb, dst1, dst2, sigmaR, sigmaS, 0.03f)
            launch(Dispatchers.Main) {
                mBinding.isLoading = false
                mBinding.ivResult.showMat(dst2)
            }
        }
    }

    private fun doStylization() {
        val dst = Mat()
        mBinding.isLoading = true
        GlobalScope.launch(Dispatchers.IO) {
            Photo.stylization(mRgb, dst, sigmaR, sigmaS)
            launch(Dispatchers.Main) {
                mBinding.isLoading = false
                mBinding.ivResult.showMat(dst)
            }
        }
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.menu_non_photorealistic_rendering, menu)
        return true
    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        title = item.title
        when (item.itemId) {
            R.id.photo_edge_preserving_normconv_filter
            -> {
                doEdgePreservingFilter(Photo.NORMCONV_FILTER)
            }
            R.id.photo_edge_preserving_recurs_filter
            -> {
                doEdgePreservingFilter(Photo.RECURS_FILTER)
            }
            R.id.photo_detail_enhance
            -> {
                doDetailEnhance()
            }
            R.id.photo_pencil_sketch
            -> {
                doPencilSketch()
            }
            R.id.photo_stylization
            -> {
                doStylization()
            }
        }
        return true
    }

    fun incSigmaR(view: View) {
        this.sigmaR = this.sigmaR.plus(1.0f)
        if (this.sigmaR > 200.0f) {
            this.sigmaR = 200f
        }
    }

    fun decSigmaR(view: View) {
        this.sigmaR = this.sigmaR.minus(1.0f)
        if (this.sigmaR < 0f) {
            this.sigmaR = 0f
        }
    }

    fun incSigmaS(view: View) {
        this.sigmaS = this.sigmaS.plus(.1f)
        if (this.sigmaS > 1.0f) {
            this.sigmaS = 1f
        }
    }

    fun decSigmaS(view: View) {
        this.sigmaS = this.sigmaS.minus(.1f)
        if (this.sigmaS < 0f) {
            this.sigmaS = 0f
        }
    }
}

效果

以上就是Android基于OpenCV實現(xiàn)非真實渲染的詳細內(nèi)容,更多關(guān)于Android OpenCV實現(xiàn)非真實渲染的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Android如何在root設(shè)備上開啟ViewServer詳解

    Android如何在root設(shè)備上開啟ViewServer詳解

    這篇文章主要給大家介紹了關(guān)于Android中如何在root設(shè)備上開啟ViewServer的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者具有一定的參考學習價值,需要的朋友們下面來一起看看吧。
    2017-12-12
  • Android 圖片Bitmap的剪切的示例代碼

    Android 圖片Bitmap的剪切的示例代碼

    本篇文章主要介紹了Android 圖片Bitmap的剪切的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • Android進程?;钪嵘M程優(yōu)先級

    Android進程?;钪嵘M程優(yōu)先級

    這篇文章主要介紹了Android進程?;钪嵘M程優(yōu)先級,對提升優(yōu)先級感興趣的同學可以參考下
    2021-04-04
  • Android 中 MD5 的幾種生成方式(小結(jié))

    Android 中 MD5 的幾種生成方式(小結(jié))

    這篇文章主要介紹了Android 中 MD5 的幾種生成方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • Android發(fā)布項目到jitpack的完整步驟

    Android發(fā)布項目到jitpack的完整步驟

    這篇文章主要給大家介紹了關(guān)于Android發(fā)布項目到jitpack的完整步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-01-01
  • Android圖片實現(xiàn)壓縮處理的實例代碼

    Android圖片實現(xiàn)壓縮處理的實例代碼

    本篇文章主要介紹了Android圖片實現(xiàn)壓縮處理的實例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Android 設(shè)置Edittext獲取焦點并彈出軟鍵盤

    Android 設(shè)置Edittext獲取焦點并彈出軟鍵盤

    本文主要介紹了Android設(shè)置Edittext獲取焦點并彈出軟鍵盤的實現(xiàn)代碼。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-04-04
  • Android RecyclerView實現(xiàn)拼團倒計時列表實例代碼

    Android RecyclerView實現(xiàn)拼團倒計時列表實例代碼

    這篇文章主要給大家介紹了關(guān)于Android RecyclerView實現(xiàn)拼團倒計時列表的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對各位Android開發(fā)者們具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-09-09
  • Android開發(fā)之ImageLoader本地緩存

    Android開發(fā)之ImageLoader本地緩存

    ImageLoader是一個圖片緩存的開源庫,提供了強大的圖片緩存機制,很多開發(fā)者都在使用,今天給大家介紹Android開發(fā)之ImageLoader本地緩存。對imageloader本地緩存相關(guān)知識感興趣的朋友一起學習吧
    2016-01-01
  • Android編程實現(xiàn)給Button添加圖片和文字的方法

    Android編程實現(xiàn)給Button添加圖片和文字的方法

    這篇文章主要介紹了Android編程實現(xiàn)給Button添加圖片和文字的方法,涉及Android針對按鈕元素屬性的相關(guān)操作技巧,需要的朋友可以參考下
    2015-11-11

最新評論

小金县| 右玉县| 牟定县| 长海县| 博湖县| 阿克陶县| 雷波县| 武宁县| 泌阳县| 庆安县| 西林县| 西林县| 金寨县| 马龙县| 蒙自县| 富裕县| 三河市| 五常市| 宁远县| 洛阳市| 石屏县| 富宁县| 会宁县| 从化市| 藁城市| 勃利县| 灌阳县| 修水县| 库车县| 平凉市| 岑巩县| 从江县| 房山区| 泸水县| 双桥区| 禄劝| 北川| 韩城市| 资源县| 塔城市| 邹平县|