npm run ios 빌드오류

React Native- Failed to build IOS project. We ran "xcodebuild" command but it exited with error code 65

위와 같은 오류가 발생했고, 구글링 과정에서 ios/pods/podfile 수정을 통해 해결할 수 있다고 해서 변경했다.

use_flipper ~

post_install do |installer|

flipper_post_install(installer)

end

 

이부분 삭제하고 저장.

 

수정 후

pod deintegrate

pod install

 

여기까지 수행하고 오류 그대로 발생. 그러나 오류코드 하단에

 

nvm is not compatible with the "npm_config_prefix" environment variable: currently set to "opt/homebrew"

Run 'unset npm_config_prefix' to unset it

 

이라는 메세지가 있어서

unset npm_config_prefix

수행 후 빌드 성공했다.

리액트 네이티브 개발에서 사용하는 명령

  • npm i

package.json 파일에 명시된 패키지를 node_modules 디렉터리에 설치

설치한 패키지는 android나 ios 디렉터리의 네이티브 모듈에서 동작하는 파일을 가진다.

  • npm pod-install

objc와 같은 c계열 언어는 원격 저장소에서 패키지를 내려받아 설치하는 기능이 없다.

따라서 pod 프로그램을 통해 패키지를 설치해야하므로 사용

  • npm start

npm run android, npm run ios 명령은 네이티브 부분 앱을 빌드하여 에뮬레이터에 설치하고 자동으로 실행한다.

에뮬레이터에 설치된 앱은 처음 실행될 때 메트로 서버에서 ES5자바스크립트 코드를 내려받는다.

그러므로 위의 명령을 실행하기 전에 npm start로 메트로 서버를 실행한다.

npm 과 npx

npm : Package Manager (관리)

npx : Package Runner (실행)

 

npx는 npm의 5.2.0 버전부터 새로 추가된 도구. 따라서 npm과 비교대상이 아닌 npm을 좀 더 편하게 사용하기 위해서 npm에서 제공해주는 하나의 도구.

 

등장 배경

 

npm 패키지 설치할 때 두가지 케이스가 있다.

  1. 전역으로 패키지를 설치하여 의존성 라이브러리들을 전체적으로 관리하는 방법
  2. 특정 프로젝트에만 의존성 라이브러리를 설치하는 방법

npx를 언제 사용할까?

  • npm run-script를 사용하지 않고 로컬에 설치된 패키지를 사용할 경우
  • 일회성 명령으로 패키지를 실행할 경우 -> 로컬에 설치된 패키지가 없다면 install및 호출을 한번에 해준다.
  • gist_based scripts를 실행할 경우 -> gist라는 곳에 스크립트를 올리고 npx {gist url}로 쉽게 코드 실행이가능하다.
  • 특정 노드 버전의 스크립트를 실행할 경우

npm run ios 빌드오류

React Native- Failed to build IOS project. We ran "xcodebuild" command but it exited with error code 65

위와 같은 오류가 발생했고, 구글링 과정에서 ios/pods/podfile 수정을 통해 해결할 수 있다고 해서 변경했다.

use_flipper ~

post_install do |installer|

flipper_post_install(installer)

end

 

이부분 삭제하고 저장.

 

수정 후

pod deintegrate

pod install

 

여기까지 수행하고 오류 그대로 발생. 그러나 오류코드 하단에

 

nvm is not compatible with the "npm_config_prefix" environment variable: currently set to "opt/homebrew"

Run 'unset npm_config_prefix' to unset it

 

이라는 메세지가 있어서

unset npm_config_prefix

수행 후 빌드 성공했다.

'TIL' 카테고리의 다른 글

JavaScript ES6 문법 정리  (0) 2021.10.17
2021.09.11  (0) 2021.09.11
2021.09.08  (0) 2021.09.08
[TIL] python OpenCV - threshold 함수로 경계선 얻기  (0) 2021.07.26
[TIL] python OpenCV - 1  (1) 2021.07.26

Git Flow

 

회사에서 사용하는 Git Flow 사용에 대해 오해가 있었다. 맨날 나만몰라...🥲

 

오늘 처음으로 팀 미팅이 있었는데, 회사의 개발 전략에 대해서 소개했었다.

Git Flow에 대해 소개하는 시간이 있었는데, Origin Remote Repository와 Remote Branch의 개념이 헷갈렸었다. 하 소개하는놈이

Github 의 React Repository의 경우로 생각하면 Upstream Remote Repositry의 경우 레포지토리의 주인인 Facebook이 React Repository의 Upstream Remote Repository일 것이다.

이를 내가 fork 할 경우 내 계정에 생성된 React 레포지토리가 Origin Remote Repository가 될것이다.

여기서 내 github에 있는 레포지토리를 clone 해서 로컬 PC에 저장하면 Local Repository가 된다고 보면된다.

 

항상 좋은 분위기로 정답을 이끌어주는 찬해형에게 감사를... ㅠ

 

Expo VS React-Native

 

Expo의 장점

- Expo앱을 개인 핸드폰에 설치하여 장치에서 쉽게 테스트, 디버깅이 가능하다

- Xcode, Android Studio 설치와 개발자 계정, signing.. 등의 번거로운 과정없이 바로 개발 가능하다. (이 부분은 구글링을 통해 검증하지 못했다.)

 

Expo 단점

- RN의 완전한 기능을 사용할 수 없다. (EXPO에서 제공하는 API만 사용가능하다.)

- OAuth2.0, Map API 사용에 어려움이 있다.

- 빌드시간이 오래걸린다. (찬해형 피셜 최악이었다고한다.)

 

사실 Expo의 장점에 대해서 크게 이점이라고 다가오는게 없었기도 했고, 구글의 방대한 자료(한국어 한정)에서도 Expo 사용에 긍정적인 반응이 크게 없었던것으로 봐서는 RN만으로 개발을 하는게 안전하지 않을까 싶다.

 

팀에 꼭 필요한 사람이 되자.

오늘 발표 절어서 매우 부끄러우니 다음에는 더 잘 할 수 있도록 하자.

좀더 노력하자. (맨날 핑계대지말고 좀 하자)

 

 

Reference

https://velog.io/@max9106/React-Native-%EB%A6%AC%EC%95%A1%ED%8A%B8-%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8Creact-native-%EB%91%90-%EA%B0%80%EC%A7%80-%EB%B0%A9%EB%B2%95-c4k0gxe0tc

 

[React Native] 리액트 네이티브(react native) 두 가지 방법 #1 Expo CLI

리액트 네이티브 개발 방법 리액트 네이티브는 아래와 같이 2가지 개발 방법이있다. Expo CLI React Native CLI Expo란? 쉽게 말해, 리엑트 네이티브로 하는 개발을 쉽게 할 수 있게 해주는 것이다. 리엑

velog.io

https://floydkim.github.io/2019-05-04-React-Native-EXPO%EC%99%80-%EC%9D%B4%EB%B3%84%ED%95%98%EA%B8%B0/

 

React native : expo와 이별하기

EXPO와 이별하기 React-Native를 이용해 모바일 앱을 만들 때, EXPO는 개발자가 앱 코딩을 빨리 시작할 수 있도록 도와줍니다. EXPO 없이 React-Native만으로 개발을 시작하려면 Xcode나 Android Studio를 설치하

floydkim.github.io

https://medium.com/official-podo/expo%EB%A1%9C-%EC%95%B1-%EB%A7%8C%EB%93%A4%EC%96%B4%EB%B3%B8-%ED%9B%84%EA%B8%B0-vs-vanilla-react-native-fc20c8dac937

 

expo로 앱 만들어본 후기(vs vanilla react-native)

함께해서 즐거웠고 다신 만나지 말자✋

medium.com

 

'TIL' 카테고리의 다른 글

2021.09.11  (0) 2021.09.11
2021.09.09  (0) 2021.09.10
[TIL] python OpenCV - threshold 함수로 경계선 얻기  (0) 2021.07.26
[TIL] python OpenCV - 1  (1) 2021.07.26
외부에서 내 컴퓨터 접속하기 (apache, 포트포워딩)  (1) 2021.03.29

문제 설명

개발자가 사용하는 언어와 언어 선호도를 입력하면 그에 맞는 직업군을 추천해주는 알고리즘을 개발하려고 합니다.

아래 표는 5개 직업군 별로 많이 사용하는 5개 언어에 직업군 언어 점수를 부여한 표입니다.

점수SI CONTENTS HARDWARE PORTAL GAME

5 JAVA JAVASCRIPT C JAVA C++
4 JAVASCRIPT JAVA C++ JAVASCRIPT C#
3 SQL PYTHON PYTHON PYTHON JAVASCRIPT
2 PYTHON SQL JAVA KOTLIN C
1 C# C++ JAVASCRIPT PHP JAVA

예를 들면, SQL의 SI 직업군 언어 점수는 3점이지만 CONTENTS 직업군 언어 점수는 2점입니다. SQL의 HARDWARE, PORTAL, GAME 직업군 언어 점수는 0점입니다.

직업군 언어 점수를 정리한 문자열 배열 table, 개발자가 사용하는 언어를 담은 문자열 배열 languages, 언어 선호도를 담은 정수 배열 preference가 매개변수로 주어집니다. 개발자가 사용하는 언어의 언어 선호도 x 직업군 언어 점수의 총합이 가장 높은 직업군을 return 하도록 solution 함수를 완성해주세요. 총합이 같은 직업군이 여러 개일 경우, 이름이 사전 순으로 가장 빠른 직업군을 return 해주세요.


제한사항

  • table의 길이 = 5
    • table의 원소는 "직업군 5점언어 4점언어 3점언어 2점언어 1점언어"형식의 문자열입니다. 직업군, 5점언어, 4언어, 3점언어, 2점언어, 1점언어는 하나의 공백으로 구분되어 있습니다.
    • table은 모든 테스트케이스에서 동일합니다.
  • 1 ≤ languages의 길이 ≤ 9
    • languages의 원소는 "JAVA", "JAVASCRIPT", "C", "C++" ,"C#" , "SQL", "PYTHON", "KOTLIN", "PHP" 중 한 개 이상으로 이루어져 있습니다.
    • languages의 원소는 중복되지 않습니다.
  • preference의 길이 = languages의 길이
    • 1 ≤ preference의 원소 ≤ 10
  • preference의 i번째 원소는 languages의 i번째 원소의 언어 선호도입니다.
  • return 할 문자열은 "SI", "CONTENTS", "HARDWARE", "PORTAL", "GAME" 중 하나입니다.

입출력 예

tablelanguagespreferenceresult

["SI JAVA JAVASCRIPT SQL PYTHON C#", "CONTENTS JAVASCRIPT JAVA PYTHON SQL C++", "HARDWARE C C++ PYTHON JAVA JAVASCRIPT", "PORTAL JAVA JAVASCRIPT PYTHON KOTLIN PHP", "GAME C++ C# JAVASCRIPT C JAVA"] ["PYTHON", "C++", "SQL"] [7, 5, 5] "HARDWARE"
["SI JAVA JAVASCRIPT SQL PYTHON C#", "CONTENTS JAVASCRIPT JAVA PYTHON SQL C++", "HARDWARE C C++ PYTHON JAVA JAVASCRIPT", "PORTAL JAVA JAVASCRIPT PYTHON KOTLIN PHP", "GAME C++ C# JAVASCRIPT C JAVA"] ["JAVA", "JAVASCRIPT"] [7, 5] "PORTAL"

입출력 예 설명

입출력 예 #1

각 직업군 별로 점수를 계산해보면 아래와 같습니다.

아래 사진은 개발자 언어 선호도 나타낸 표입니다.

아래 사진은 개발자가 선호하는 언어의 직업군 언어 점수를 나타낸 표입니다.

따라서 점수 총합이 41로 가장 높은 "HARDWARE"를 return 해야 합니다.

입출력 예 #2

각 직업군 별로 점수를 계산해보면 아래와 같습니다.

아래 사진은 개발자 언어 선호도 나타낸 표입니다.

아래 사진은 개발자가 선호하는 언어의 직업군 언어 점수를 나타낸 표입니다.


점수 총합이 55로 가장 높은 직업군은 "SI" 와 "PORTAL"입니다.
따라서 사전 순으로 먼저 오는 "PORTAL"을 return 해야 합니다.

 

나의 풀이

첫번째 파라미터로 오는 배열을 보면 첫번째 값에는 직업군, 그 이후에는 언어가 오게되므로 우선 하나의 문자열을 분리시켰다.

그 이후 점수 총합과 직업군을 저장하기위해 key, value로 값을 저장하는 hashMap을 사용하여 점수 총합과 직업을 저장했다.

만약 점수가 같은 직업이 있다면 정렬을 통해 사전순서가 빠른 직업군을 리턴하도록 했다.

 

코틀린 언어가 익숙하지 않아서 조금 헤매었는데 풀고나니 조타 ㅎㅅㅎ

+ 프로그래머스와 내 로컬환경의 컴파일옵션이 달라서 그런지 내 노트북에서는 잘 컴파일 되었는데 프로그래머스에서 실행하면

오류가 많이 떠서 수정하는데 시간이 좀 걸렸다. 

import kotlin.collections.HashMap

class Solution {
   fun solution(table: Array<String>, languages: Array<String>, preference: IntArray): String {

        var hashMap = HashMap<String, Int>()
        for (i in table.indices) { // 첫번째 배열 아이템 나누기
            var tableArr = table[i].split(" ")
            var sum = 0

            for (j in languages.indices) {
                var idx = tableArr.indexOf(languages[j])
                if (idx != -1) {
                    var size = tableArr.size - idx
                    sum += size * preference[j]
                }
            }
            hashMap.put(tableArr[0],sum)
        }
        var maxVal = hashMap.values.max()
        var answers = hashMap.filter { it.value == maxVal }
        return answers.keys.min()!!
    }
}

 

Rxjava와 MVVM 패턴을 사용한 영화 앱 강의를 듣던 중 유용해 보이는 플러그인을 발견해서 소개하려고 합니다.

 

플러그인 이름에서 볼 수 있듯이 Json 형식의 문자열을 코틀린 데이터 클래스로 쉽게 변환 해준다고 하네요.

 

간단한 사용법을 이미지와 함께 소개하겠습니당 ^0^

 

 

먼저 안드로이드 스튜디오 실행 후 File > Settings > Plugins 항목에서 json to kotlin 검색하여 설치하면

 

 

아래와 같이 새로운 파일 생성 시 "Kotlin data class File from JSON" 항목을 선택할 수 있습니다.

 

선택 후 Json 형식의 텍스트를 붙여넣기 해준 후에, 오른쪽 상단의 포맷 버튼을 눌러주면 붙여넣기로 인해 줄바꿈이 되어 있지 않던 Json 형식의 데이터가 보기좋게 정리됩니다. 하단의 Class Name에 원하는 클래스 명을 입력 하시면 그대로 데이터 클래스가 생성됩니다. 

 

 

추가적으로 설정하고 싶으신 옵션이 있으면 Advanced 버튼 클릭 후 둘러보세용..

 

짜잔 아주 간단하게 데이터 클래스가 생성된 모습 ^&^

 

문제 설명

대학 교수인 당신은, 상호평가를 통하여 학생들이 제출한 과제물에 학점을 부여하려고 합니다. 아래는 0번부터 4번까지 번호가 매겨진 5명의 학생들이 자신과 다른 학생의 과제를 평가한 점수표입니다.

No. 0 1 2 3 4
0 100 90 98 88 65
1 50 45 99 85 77
2 47 88 95 80 67
3 61 57 100 80 65
4 24 90 94 75 65
평균 45.5 81.25 97.2 81.6 67.8
학점 F B A B D

위의 점수표에서, i행 j열의 값은 i번 학생이 평가한 j번 학생의 과제 점수입니다.

  • 0번 학생이 평가한 점수는 0번 행에담긴 [100, 90, 98, 88, 65]입니다.
    • 0번 학생은 자기 자신에게 100점, 1번 학생에게 90점, 2번 학생에게 98점, 3번 학생에게 88점, 4번 학생에게 65점을 부여했습니다.
  • 2번 학생이 평가한 점수는 2번 행에담긴 [47, 88, 95, 80, 67]입니다.
    • 2번 학생은 0번 학생에게 47점, 1번 학생에게 88점, 자기 자신에게 95점, 3번 학생에게 80점, 4번 학생에게 67점을 부여했습니다.

당신은 각 학생들이 받은 점수의 평균을 구하여, 기준에 따라 학점을 부여하려고 합니다.
만약, 학생들이 자기 자신을 평가한 점수가 유일한 최고점 또는 유일한 최저점이라면 그 점수는 제외하고 평균을 구합니다.

  • 0번 학생이 받은 점수는 0번 열에 담긴 [100, 50, 47, 61, 24]입니다. 자기 자신을 평가한 100점은 자신이 받은 점수 중에서 유일한 최고점이므로, 평균을 구할 때 제외합니다.
    • 0번 학생의 평균 점수는 (50+47+61+24) / 4 = 45.5입니다.
  • 4번 학생이 받은 점수는 4번 열에 담긴 [65, 77, 67, 65, 65]입니다. 자기 자신을 평가한 65점은 자신이 받은 점수 중에서 최저점이지만 같은 점수가 2개 더 있으므로, 유일한 최저점이 아닙니다. 따라서, 평균을 구할 때 제외하지 않습니다.
    • 4번 학생의 평균 점수는 (65+77+67+65+65) / 5 = 67.8입니다.

제외할 점수는 제외하고 평균을 구한 후, 아래 기준에 따라 학점을 부여합니다.

평균학점

90점 이상 A
80점 이상 90점 미만 B
70점 이상 80점 미만 C
50점 이상 70점 미만 D
50점 미만 F

학생들의 점수가 담긴 정수형 2차원 배열 scores가 매개변수로 주어집니다. 이때, 학생들의 학점을 구하여 하나의 문자열로 만들어서 return 하도록 solution 함수를 완성해주세요.


제한사항

  • 2 ≤ scores의 행의 길이(학생 수) ≤ 10
  • scores의 열의 길이 = scores의 행의 길이
    • 즉, scores는 행과 열의 길이가 같은 2차원 배열입니다.
  • 0 ≤ scores의 원소 ≤ 100
  • return 값 형식
    • 0번 학생의 학점부터 차례대로 이어 붙인 하나의 문자열을 return 합니다.

입출력 예

scoresresult

[[100,90,98,88,65],[50,45,99,85,77],[47,88,95,80,67],[61,57,100,80,65],[24,90,94,75,65]] "FBABD"
[[50,90],[50,87]] "DA"
[[70,49,90],[68,50,38],[73,31,100]] "CFD"

입출력 예 설명

입출력 예 #1

문제 예시와 같습니다.

입출력 예 #2

No. 0 1
0 50 90
1 50 87
평균 50 90
학점 D A
  • 1번 학생이 자기 자신을 평가한 87점은 [90, 87]에서 유일한 최저점이므로, 평균을 구할 때 제외합니다.

입출력 예 #3

No. 0 1 2
0 70 49 90
1 68 50 38
2 73 31 100
평균 70.33… 40 64
학점 C F D
  • 1번 학생이 자기 자신을 평가한 50점은 [49, 50, 31]에서 유일한 최고점이므로, 평균을 구할 때 제외합니다.
  • 2번 학생이 자기 자신을 평가한 100점은 [90, 38, 100]에서 유일한 최고점이므로, 평균을 구할 때 제외합니다.

 

나의 풀이

 

1. 2차원 배열의 행 열을 변경하기 -> 코틀린 배열에서 제공하는 max, min 함수 사용을 위해

2. 자기 자신에게 평가 한 경우 max 또는 min 값인지 확인 후에 유일한 최저점, 최고점 확인 

 

class Solution {
     fun solution(scores: Array<IntArray>): String {
        var answer: String = ""
        var rotatedScores : Array<IntArray> = Array(scores.size) { IntArray(scores.size)}

        for ( i in scores.indices)
            for (j in scores[i].indices)
                rotatedScores[i][j] = scores[j][i]

        for (i in scores.indices)
        {
            var sum = 0.0F
            var cnt = rotatedScores[i].size

            for ( j in rotatedScores[i].indices)
            {
                if (i == j)
                {
                    if (rotatedScores[i][j] == rotatedScores[j].min() ||
                            rotatedScores[i][j] == rotatedScores[j].max())
                    {
                        var countOfSameVal = rotatedScores[i].filter { it.equals(rotatedScores[i][j])}
                        if (countOfSameVal.size < 2) {
                            cnt -= 1
                            continue
                        }
                    }
                }
                sum += rotatedScores[i][j]
            }
            sum /= cnt

            when (sum) {
                in 90F..100F -> answer = answer.plus("A")
                in 80F..90F -> answer = answer.plus("B")
                in 70F..80F -> answer = answer.plus("C")
                in 50F..70F -> answer = answer.plus("D")
                in  0F..50F -> answer = answer.plus("F")
            }
        }
        return answer
    }
}

코드는 생각보다 길어졌지만 코틀린에 익숙해지는 것을 목표로 해본다 ㅠ

  • 부족한 금액 계산하기

문제 설명

새로 생긴 놀이기구는 인기가 매우 많아 줄이 끊이질 않습니다. 이 놀이기구의 원래 이용료는 price원 인데, 놀이기구를 N 번 째 이용한다면 원래 이용료의 N배를 받기로 하였습니다. 즉, 처음 이용료가 100이었다면 2번째에는 200, 3번째에는 300으로 요금이 인상됩니다.
놀이기구를 count번 타게 되면 현재 자신이 가지고 있는 금액에서 얼마가 모자라는지를 return 하도록 solution 함수를 완성하세요.
단, 금액이 부족하지 않으면 0을 return 하세요.

제한사항

  • 놀이기구의 이용료 price : 1 ≤ price ≤ 2,500, price는 자연수
  • 처음 가지고 있던 금액 money : 1 ≤ money ≤ 1,000,000,000, money는 자연수
  • 놀이기구의 이용 횟수 count : 1 ≤ count ≤ 2,500, count는 자연수

입출력 예

pricemoneycountresult

3 20 4 10

입출력 예 설명

입출력 예 #1
이용금액이 3인 놀이기구를 4번 타고 싶은 고객이 현재 가진 금액이 20이라면, 총 필요한 놀이기구의 이용 금액은 30 (= 3+6+9+12) 이 되어 10만큼 부족하므로 10을 return 합니다.

참고 사항

  • 미션 언어는 Java, JavaScript, Python3, C++ 만 해당 됩니다.
  • 같은 코드를 제출한 사람이 여럿이라면 코드를 가장 먼저 제출한 분께 상품을 드립니다.
  • 좋아요 수가 동일할 경우 코드를 가장 먼저 제출한 분께 상품을 드립니다.

 

나의 풀이

 

문제는 간단했는데, 네가지 테스트가 계속 실패하는 바람에.. 도무지 모르겠어서 구글링 했더니 money값을 받을 때 

int형이 아닌 long형으로 받아야 한다고 해서 매개변수 타입을 long으로 변경하니 성공했다.. 문제를 보면 알 수 있는 부분인데 좀더 문제를 정확히 읽고 풀어야겠다 ㅠ-ㅠ

    public long solution(int price, long money, int count) {
        for(int i = 1; i <= count; i++)  
            money = money - price * i;
        return  money > 0 ? 0 : money*-1;
    }

이미지 경계선 얻기 - cv2.threshold()

 

우선 피포페인팅 도안을 생성하기 위해 도안이 될 이미지에서 선을 따는 작업이 필요했는데, 이를 도와줄 함수로 

cv2.threshold() 함수가 적절해 보여서, 사용하기로 했다. 비슷한 기능을 할 만한 함수로 cv2.canny() 함수가 있었는데, 다음 장에서 차이

threshold는 구글 번역기에서는 한계점 이라고 해석되는데, 구글링을 통해 관련 문서를 보면 임계점(사실 같은뜻이지만?) 이라고 많이 부르는 것 같다. 

 

임계점이라는 의미를 알았으니, OpenCV doc에서 cv2.threshold() 함수의 설명과 파라미터에 대해 알아보자.

 

문서의 내용을 간단히 요약하면, 

"픽셀 값이 임계값보다 작으면 0으로 설정되고, 그렇지 않으면 최대값으로 설정됩니다."

이 부분이 메인이라고 볼 수 있을 것 같다.

 

파라미터를 살펴보자.

cv2.threshold(src, thresh, maxval, type)

return value : retval, dst

parameter
src - 첫 번째 인수는 회색조 이미지여야 하는 소스 이미지 입니다.
thresh - 두 번째 인수는 픽셀 값을 분류하는 데 사용되는 임계값입니다.
maxval - 세 번째 인수는 임계값을 초과하는 픽셀 값에 할당되는 최대값입니다.
type - OpenCV는 함수의 네 번째 매개변수에 의해 제공되는 다양한 유형의 임계값을 제공합니다. 위에서 설명한 기본 임계값은 cv.THRESH_BINARY 유형을 사용하여 수행됩니다 . 

return value
retval - 첫 번째는 사용된 임계값이고
dst - 두 번째 출력은 임계값 이미지 입니다

 

OpenCV 문서에 아주 상세하게 설명되어 있다.

 

네번째 파라미터인 type을 변경해가면서 테스트를 해볼텐데, 나는 백예린님의 팬이므로 백예린님 사진을 통해 type을 변경해가면서 비교해보자.

 

코드의 출처는 OpenCV docs 문서이며, 이미지의 경로만 변경했다.

import cv2 as cv
import numpy as np
from matplotlib import pyplot as plt
img = cv.imread('D:\yerin.jpg',0)
ret,thresh1 = cv.threshold(img,127,255,cv.THRESH_BINARY)
ret,thresh2 = cv.threshold(img,127,255,cv.THRESH_BINARY_INV)
ret,thresh3 = cv.threshold(img,127,255,cv.THRESH_TRUNC)
ret,thresh4 = cv.threshold(img,127,255,cv.THRESH_TOZERO)
ret,thresh5 = cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
titles = ['Original Image','BINARY','BINARY_INV','TRUNC','TOZERO','TOZERO_INV']
images = [img, thresh1, thresh2, thresh3, thresh4, thresh5]
for i in range(6):
    plt.subplot(2,3,i+1),plt.imshow(images[i],'gray',vmin=0,vmax=255)
    plt.title(titles[i])
    plt.xticks([]),plt.yticks([])
plt.show()

 

 

내가 원하는 피포페인팅의 도안을 위해서는 BINARY type을 사용하는게 맞아보인다.

 

사실 지금 사용하고 있는 경계선을 얻어내는 방식은 cv2.canny()함수를 사용하고 있는데 프로토타입이 완성되면

품질 향상을 위해 threshold 함수도 고려해볼 수 있어보인다.

 

이상으로 오늘의 포스팅은 끗 ㅎㅅㅎ

 

Reference

 

https://docs.opencv.org/4.5.2/d7/d4d/tutorial_py_thresholding.html

 

OpenCV: Image Thresholding

Goal In this tutorial, you will learn simple thresholding, adaptive thresholding and Otsu's thresholding. You will learn the functions cv.threshold and cv.adaptiveThreshold. Simple Thresholding Here, the matter is straight-forward. For every pixel, the sam

docs.opencv.org

https://opencv-python.readthedocs.io/en/latest/doc/09.imageThresholding/imageThresholding.html

 

이미지 임계처리 — gramman 0.1 documentation

기본 임계처리 이진화 처리는 간단하지만, 쉽지 않은 문제를 가지고 있다. 이진화란 영상을 흑/백으로 분류하여 처리하는 것을 말합니다. 이때 기준이 되는 임계값을 어떻게 결정할 것인지가 중

opencv-python.readthedocs.io

 

'TIL' 카테고리의 다른 글

2021.09.09  (0) 2021.09.10
2021.09.08  (0) 2021.09.08
[TIL] python OpenCV - 1  (1) 2021.07.26
외부에서 내 컴퓨터 접속하기 (apache, 포트포워딩)  (1) 2021.03.29
C언어에서 배열의 크기를 변수로 선언할 수 있을까?  (5) 2019.10.29

2021.07.26

오늘부터 토이 프로젝트로 개발중인 P4Maker를 개발하면서 배운 점들을 기록하려고 합니다.

개발하게된 이유는 가지고있는 피포 페인팅이 완성 된 후 새로운 그림을 그리고 싶은데, 마음에 드는 도안이 없어서

직접 개발해보면 어떨까 싶은 생각에 개발하게 되었습니다.

 

오늘부터 화이팅 해보자 ^0^..

 

니코쌤 강의 도중 github page에 배포하는 부분에서 오류가 발생했다.

 

1. A branch named 'gh-pages' already exists.

검색해보니 node_modules/.cache/gh-pages 폴더 삭제하면 됨

 

2. remote: Permission to gogoadl/movie_app_2021.git denied to AdamPark0030.
fatal: unable to access 'https://github.com/gogoadl/movie_app_2021.git/': The requested URL returned error: 403

 

이건 최초로 git에 등록한 계정과 배포에 사용할 계정이 다를경우 발생하는데, Windows 사용자 기준으로

Windows 키 > 자격 증명 관리자 > 일반 자격 증명 > git:https://github.com 항목을 편집하여

배포에 사용할 계정의 ID와 비밀번호로 업데이트 시켜준 후에 다시 시도해서 성공했다.

 

'React' 카테고리의 다른 글

react router가 동작하지 않을 때  (1) 2021.12.05

+ Recent posts