Android 는 OpenCV 를 기반 으로 비 진실 렌 더 링 을 실현 합 니 다.

비 리 얼 렌 더 링
비 진실 감 렌 더 링(Non Photorealistic Rendering,NPR 로 약칭)은 컴퓨터 를 이용 하여 각종 시각 예술의 그리 기 스타일 을 모 의 하고 새로운 그리 기 스타일 을 발전 시 키 는 데 도 사용 된다.예 를 들 어 중국화,수채화,스케치,유화,판화 등 예술 스타일 을 모 의 한다.NPR 도 3 차원 장면 을 풍부 하고 특별한 새로운 시각 효 과 를 나타 내 혁신 적 인 기능 을 가지 게 할 수 있다.NPR 렌 더 링 은 애니메이션,게임 등 엔 터 테 인 먼 트 분야 에 강력 한 예술 형식 으로 응용 되 고 공정,산업 디자인 도면 에 도 나타난다.넓 은 응용 분 야 는 그의 예술 표현 형식 이 다양 할 뿐만 아니 라 컴퓨터 가 원래 의 작업량 이 많 고 난이도 가 높 은 창작 작업 을 보조 할 수 있 기 때문이다.현재 FinalToon,Il-lustrator,Pencil 등 3 차원 소프트웨어 를 기반 으로 한 NPR 렌 더러 가 상당히 많 으 며,프로그램 스티커 를 빌려 NPR 의 소 재 를 만 들 고 손 으로 그린 스타일 의 이미지 효 과 를 만 드 는 데 도 도움 을 줄 수 있다.또한,Mental Ray,Reyes,Brazil 등 외 장 렌 더러 는 모두 NPR 렌 더 링 솔 루 션 입 니 다.
인용
API
OpenCV 는 우리 에 게 네 가지 비 진실 렌 더 링 의 사용 장면 을 제공 했다.가장자리 보존 필터,디 테 일 강화,스케치 연필 그림,스타일 화 이다.
테두리 유지 필터

public static void edgePreservingFilter(Mat src, Mat dst, int flags, float sigma_s, float sigma_r)
  • 매개 변수 1:src,그림 입력,8 비트 3 채널.
  • 매개 변수 2:dst,출력 이미지,8 비트 3 채널.
  • 매개 변수 3:flags,가장자리 보존 표지 위치.
  • 
    public static final int
            RECURS_FILTER = 1,
            NORMCONV_FILTER = 2;
    
  • 매개 변수 4:sigmas,인접 지역 크기.수치 0~200.
  • 매개 변수 5:sigmar.이웃 지역 내 평균 색상 의 불 균형 정도.수치 0~1.
  • 디 테 일 강화
    
    public static void detailEnhance(Mat src, Mat dst, float sigma_s, float sigma_r)
    
  • 매개 변수 1:src,그림 입력,8 비트 3 채널.
  • 매개 변수 2:dst,출력 이미지,8 비트 3 채널.
  • 매개 변수 3:sigmas,인접 지역 크기.수치 0~200.
  • 매개 변수 4:sigmar.이웃 지역 내 평균 색상 의 불 균형 정도.수치 0~1.
  • 스케치
    
    public static void pencilSketch(Mat src, Mat dst1, Mat dst2, float sigma_s, float sigma_r, float shade_factor)
    
  • 매개 변수 1:src,그림 입력,8 비트 3 채널.
  • 매개 변수 2:dst 1,출력 이미지,8 비트 단일 채널,즉 흑백 스케치.
  • 매개 변수 3:dst 2,출력 이미지,크기 유형 은 입력 이미지 와 같 습 니 다.즉,컬러 스케치 입 니 다.
  • 매개 변수 4:sigmas,인접 지역 크기.수치 0~200.
  • 매개 변수 5:sigmar.이웃 지역 내 평균 색상 의 불 균형 정도.수치 0~1.
  • 매개 변수 6:shadefactor,강도 크기 조정 값.수치 0~0.1
  • 풍격 화
    
    public static void stylization(Mat src, Mat dst, float sigma_s, float sigma_r) 
    
  • 매개 변수 1:src,그림 입력,8 비트 3 채널.
  • 매개 변수 2:dst,출력 이미지,8 비트 3 채널.
  • 매개 변수 3:sigmas,인접 지역 크기.수치 0~200.
  • 매개 변수 4:sigmar.이웃 지역 내 평균 색상 의 불 균형 정도.수치 0~1.
  • sigma 에 대하 여s 와 sigmar:
    sigma_s,즉 SigmaSpatial,부 드 러 운 양 을 결정 합 니 다.sigma_r,즉 SigmaRange,평균 치 를 결정 합 니 다.
    전형 적 인 부 드 러 운 필터 가 픽 셀 값 을 인접 픽 셀 의 가중 값 으로 바 꿉 니 다.인접 지역 이 클 수록 걸 러 진 그림 이 부 드 러 워 보 입 니 다.인접 지역 의 크기 와 매개 변수 sigmas 는 정비례 한다.그러나 가장자리 보존 필터 에는 두 가지 관건 이 있다.1)부 드 러 운 그림.2)부 드 러 운 테두리/색상 경계.픽 셀 값 을 이웃 픽 셀 의 가중 값 과 간단하게 바 꿀 수 없다 는 얘 기다.인접 지역 에서 현재 픽 셀 값 과 비슷 한 픽 셀 을 선택 한 다음 에 평균 값 을 찾 은 다음 에 현재 픽 셀 값 을 바 꾸 는 방식 으로 상기 문 제 를 피 합 니 다.따라서 범위 와 색상 의 유사 도 를 명 확 히 하기 위해 서 는 두 개의 인자 가 필요 하 다.
    조작 하 다.
    
    /**
     *      
     *
     * @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
            }
        }
    }
    
    효과.





    이상 은 바로 안 드 로 이 드 가 OpenCV 를 바탕 으로 비 진실 렌 더 링 을 실현 하 는 상세 한 내용 입 니 다.안 드 로 이 드 OpenCV 가 비 진실 렌 더 링 을 실현 하 는 데 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기