欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

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

非真實(shí)渲染

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

引用自【百度百科】

API

OpenCV給我們提供了四種非真實(shí)渲染的使用場(chǎng)景:邊緣保留濾波、細(xì)節(jié)增強(qiáng)、素描鉛筆畫(huà)、風(fēng)格化。

邊緣保留濾波

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

細(xì)節(jié)增強(qiáng)

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。

素描鉛筆畫(huà)

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,強(qiáng)度縮放值。取值0~0.1

風(fēng)格化

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)和。 鄰域越大,過(guò)濾后的圖像看起來(lái)越平滑。 鄰域的大小與參數(shù)sigma_s成正比。但是在邊緣保留濾波器里,有兩個(gè)關(guān)鍵點(diǎn):1)平滑圖片;2)不平滑邊緣/顏色邊界。換句話說(shuō),我們就無(wú)法簡(jiǎn)單地將像素值替換成鄰域像素的加權(quán)和。而是在鄰域內(nèi)選取和當(dāng)前像素值相近的像素然后求取平均值,然后替換當(dāng)前像素值的方式來(lái)避免上述問(wèn)題。所以就需要兩個(gè)參數(shù)來(lá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實(shí)現(xiàn)非真實(shí)渲染的詳細(xì)內(nèi)容,更多關(guān)于Android OpenCV實(shí)現(xiàn)非真實(shí)渲染的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • eclipse搭建android開(kāi)發(fā)環(huán)境詳細(xì)步驟

    eclipse搭建android開(kāi)發(fā)環(huán)境詳細(xì)步驟

    本文主要介紹了eclipse搭建android開(kāi)發(fā)環(huán)境詳細(xì)步驟,具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧
    2017-03-03
  • Android仿QQ未讀消息--紅點(diǎn)拖拽刪除【源代碼】

    Android仿QQ未讀消息--紅點(diǎn)拖拽刪除【源代碼】

    本文Demo是一款仿qq未讀消息拖拽刪除的例子,繼承RelativeLayout的WaterDrop實(shí)現(xiàn)了圓形圖標(biāo)功能;繼承ImageView的CircleImageView圓形圖片功能。效果非常不錯(cuò),很適合有圓形設(shè)計(jì)的朋友參考
    2017-04-04
  • Android動(dòng)態(tài)加載布局實(shí)現(xiàn)技巧介紹

    Android動(dòng)態(tài)加載布局實(shí)現(xiàn)技巧介紹

    通過(guò)使用LayoutInflater 每次點(diǎn)擊按鈕時(shí)候去讀取布局文件,然后找到布局文件里面的各個(gè)VIEW 操作完VIEW 后加載進(jìn)我們setContentView 方面里面的要放的布局文件里面,每次動(dòng)態(tài)加載文件必需調(diào)用 removeAllViews方法,清除之前的加載進(jìn)來(lái)的View
    2022-12-12
  • Android中 TeaScreenPopupWindow多類型篩選彈框功能的實(shí)例代碼

    Android中 TeaScreenPopupWindow多類型篩選彈框功能的實(shí)例代碼

    這篇文章主要介紹了Android TeaScreenPopupWindow多類型篩選彈框功能,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值 ,需要的朋友可以參考下
    2019-06-06
  • Android中使用PopupWindow 仿微信點(diǎn)贊和評(píng)論彈出

    Android中使用PopupWindow 仿微信點(diǎn)贊和評(píng)論彈出

    微信朋友圈的點(diǎn)贊和評(píng)論功能,有2個(gè)組成部分:左下角的“更多”按鈕;點(diǎn)擊該按鈕后彈出的對(duì)話框。這篇文章主要介紹了Android中使用PopupWindow 仿微信點(diǎn)贊和評(píng)論彈出,需要的朋友可以參考下
    2017-04-04
  • Android原生項(xiàng)目集成Flutter解決方案

    Android原生項(xiàng)目集成Flutter解決方案

    這篇文章主要介紹了Android原生項(xiàng)目集成Flutter解決方案,想了解Flutter的同學(xué)可以參考下
    2021-04-04
  • Android仿QQ微信實(shí)時(shí)監(jiān)測(cè)網(wǎng)絡(luò)狀態(tài)

    Android仿QQ微信實(shí)時(shí)監(jiān)測(cè)網(wǎng)絡(luò)狀態(tài)

    這篇文章主要為大家詳細(xì)介紹了Android仿QQ微信實(shí)時(shí)監(jiān)測(cè)網(wǎng)絡(luò)狀態(tài),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Flutter 路由插件fluro的使用

    Flutter 路由插件fluro的使用

    使用原生的路由基本上能夠滿足大部分需求,但如果想要對(duì)頁(yè)面做類似瀏覽器 url 那樣的路由,或者控制頁(yè)面跳轉(zhuǎn)的轉(zhuǎn)場(chǎng)動(dòng)畫(huà),那么原生的路由需要做不少的改造。在 pub 上,有優(yōu)秀的路由插件 fluro 解決這類問(wèn)題。本文介紹該插件的使用方法
    2021-06-06
  • 解析:繼承ViewGroup后的子類如何重寫onMeasure方法

    解析:繼承ViewGroup后的子類如何重寫onMeasure方法

    本篇文章是對(duì)繼承ViewGroup后的子類如何重寫onMeasure方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-06-06
  • Retrofit網(wǎng)絡(luò)請(qǐng)求和響應(yīng)處理重點(diǎn)分析講解

    Retrofit網(wǎng)絡(luò)請(qǐng)求和響應(yīng)處理重點(diǎn)分析講解

    這篇文章主要介紹了Retrofit網(wǎng)絡(luò)請(qǐng)求和響應(yīng)處理重點(diǎn)分析,在使用?Retrofit發(fā)起網(wǎng)絡(luò)請(qǐng)求時(shí),我們可以通過(guò)定義一個(gè)接口并使用Retrofit的注解來(lái)描述這個(gè)接口中的請(qǐng)求,Retrofit會(huì)自動(dòng)生成一個(gè)實(shí)現(xiàn)該接口的代理對(duì)象
    2023-03-03

最新評(píng)論