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)
public static final int
RECURS_FILTER = 1,
NORMCONV_FILTER = 2;
public static void detailEnhance(Mat src, Mat dst, float sigma_s, float sigma_r)
public static void pencilSketch(Mat src, Mat dst1, Mat dst2, float sigma_s, float sigma_r, float shade_factor)
public static void stylization(Mat src, Mat dst, float sigma_s, float sigma_r)
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 가 비 진실 렌 더 링 을 실현 하 는 데 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.