반응형

이번 년도 중반 쯤에 있던 일로.. ( 2023-06-01 )  내가 알기론 학교에선 자격증 따면 그걸로 바우처 신청이 가능한데.. 이게 모든 학년이 되지만 3학년 우선으로 되고 그 이후로 2학년 1학년 이렇게 되는걸로 알고 있었다.

그래서 바우처 신청이 3학년에 하는게 좋을 것 같아서 바우처 신청을 좀 더 잘 걸리게 하기 위해 ITQ 자격증을 따보았다.

 

저번에 한글 엑셀을 땄었어서 이번엔 아래 한글를 따는 것인데

문제가 발생했다.. 내가 실수로 자격증 신청을 잘 못 해서 버전이 NEO 버전인가로 신청했었다..

일반 한글 버전과는 비슷한 버전이긴 한데.. 몇가지 정보가 약간씩 틀렸다.. 무슨 함수 마법사인가 그런 것도 방식이 틀리고 해서 망했었다는 느낌이 있었는데.. 

어떻게든 일단 따야지 라는 느낌으로 가상환경에 아래 한글 NEO 버전 설치해서.. (불법) 어떻게든 연습을 해보았다.

근데 타자를 치는 것이다 보니 아무리 빨리 해도 40분보다 아래로 해결하기가 매우 어려웠다..

 

그렇게 해서 시험을 봤는데 딱히 어려운건 없었고 전부 모든 텍스트를 똑같이 오타 없이 칠려고 속도도 느리게 하면서 하나하나 세세하게 보면서 따라 쳤는데.. 이것도 엑셀과 같이 A만이라도 되자 라는 느낌으로 했는데..

분명 이것도.. 2주 정도 연습한건데..

 

또 만점을 받아 버렸다..

결과

이것도 2028년 6월 1일까지 밖에 안가는 자격증이지만.. 바우처를 신청할 수 있는 확률이 높아져서 좋았다..!

반응형
반응형

이번 년도 중반 쯤에 있던 일로.. ( 2023-04-27 )  내가 알기론 학교에선 자격증 따면 그걸로 바우처 신청이 가능한데.. 이게 모든 학년이 되지만 3학년 우선으로 되고 그 이후로 2학년 1학년 이렇게 되는걸로 알고 있었다.

그래서 바우처 신청이 3학년에 하는게 좋을 것 같아서 바우처 신청을 좀 더 잘 걸리게 하기 위해 ITQ 자격증을 따보았다.

 

먼저 한글 엑셀을 따는 것인데

2학년만 들을 수 있는 엑셀 방과후에 가서 방과후 수업을 듣고 열심히 여러번 연습하고 난 후 집에서도 수십번 연습해서 30분 안으로 단축할 수 있었다.

제일 빠르게 하면 25분 정도..?

 

그렇게 해서 시험을 본 당일에 내가 아는 지식을 모두 동원하고 프로그래밍 하던 실력으로 함수 영어로 이게 뭐하는지 대충 이해하면서 결국엔 완성 시키고 제출해서 약 40분이 걸렸다.

모두 전부 진짜 똑같이 되도록 완성 시킬려고 노력하고, A만이라도 되자 라는 느낌으로 했는데..

한달도 안되게 연습했는데.. 약 2주일..? 

 

만점을 받았다.. 전부

결과

 

이건 2028년 4월 27일까지 밖에 안가는 자격증이지만.. 바우처를 신청할 수 있는 확률이 높아져서 좋았다..!

반응형
반응형

요약 및 해결 방법

YOLO에서 학습시킬 때 파라미터에 workers를 자신의 사양에 맞게 바꾸면 된다.

train(data = data, epochs = 100, workers=<사양에 맞게 ex) 0>)

yolo train data=data epochs=100 workers=0

 

본문

인공지능을 학습할려는데 보통 윈도우로 학습하는데.. 왜 사람들이 리눅스로 학습하는지 알고 싶어서 WSL를 설치해서 CUDA 연결하고 리눅스로 YOLO를 학습 시켜보았다. 다른 학생 프로젝트 때문에

 

그런데 학습 시키는 과정에서 아래와 같은 오류가 발생했다.

CUDA kernel errors might be asynchronously reported at some other API call, so the stacktrace below might be incorrect.
For debugging consider passing CUDA_LAUNCH_BLOCKING=1.
Compile with `TORCH_USE_CUDA_DSA` to enable device-side assertions.

이 오류를 보면 CUDA_LAUNCH_BLOCKING 이거를 1로 활성화 시켜서 디버깅을 해보라고 되어있는데.. 저걸 하면 자세히 오류가 뜨기는 뜬다.. 근데 자세히 뜨기는 떠도 그냥 메모리가 모잘르다는 것 같았다.

(CUDA_LAUNCH_BLOCKING이거.. CUDA끄고 실행하는 것 같은데.. 저것 때문에 학습 속도가 엄청 느려져서.. 오류 뜰때까지 기다리는게 으음..)

 

근데 전혀 모잘르지는 않았다. 램을 많이 쓰는 것 같지만 램이 최대까지 쓰는걸 보지는 못했고 70%정도 까지만 쓰는걸로 확인이 되어서 이 문제는 아닌 것 같아서.. 여러 해결 방법을 보긴 했다.

어디서는 리눅스에 뭔가 제한이 걸려 있어서 .wslconfig로 제한을 풀거나 하는 시도로 해결했다라는 글도 보고

그냥 WSL 포기하고 리눅스로 해서 해결했다는 글도 있고..

 

근데 나는 wslconfig도 안되고 리눅스로 바꾸는 것도 할 수가 없다.

그러다가 어디선가 workers를 0으로 해보라는 글이 있어서 해봤는데.. 정상적으로 돌아갔다.

 

대충 workers의 역할이 데이터를 로드 시키면서 여러 작업들의 속도를 병렬로 처리할 수 있게 하는 것 같은데 그 뒤에 숫자는 병렬 처리하는 갯수인 걸로 짐작하긴 했는데.. 

 

왜 오류가 나는지 공식 홈페이지를 확인해보니..

https://docs.ultralytics.com/modes/train/#arguments

 

Train

Step-by-step guide to train YOLOv8 models with Ultralytics YOLO including examples of single-GPU and multi-GPU training

docs.ultralytics.com

기본적으로 값이 8이다..

하하하 저것 때문에 윈도우로 돌려서.. 조금 빡치긴 했었는데.. 일단 그래도 해결은 했다.

 

저거 값을 수정하는 과정에서 알게된건 Windows나 Linux에서는 높게 잡아도 자동으로 잡아주는 것 같은데 WSL에서만 안되는 것 같다.

그래서 하나씩 값을 높여보면서 딱 적당한 값을 찾는게 좋을 것 같다.

나는 1로 설정했는데 0으로 했을 때 40초가 나왔었는데 33초로 줄었다..

 

암튼 해결 CUDA_LAUNCH_BLOCKING

반응형

'오류 | 문제 > Python' 카테고리의 다른 글

파이썬 실행 터미널 창 변경하기  (0) 2022.07.11
반응형

일단 이 글은.. 반납하기 전에 쓴 글..

 

어쨌든!

학교에서 SCARA 로봇이나 다른 동아리 팀원들의 프로젝트를 제작하기 위해 나의 3D 프린터 1개로는 부족해서 

학교에서 쓰지도 않는 방치된 3D 프린터를 교실 내에선 쓸 수 없으니깐 다른 곳에 배치해서 쓰든 어떻게든 쓰고 싶다 했었다.

그런데.. 내가 계속 부탁을 하자.. 설치할 곳이 마땅히 없던지라.. 갑자기 "너희 집에 갔다 놓는건 어때?"라 하시더니.. 다른 선생님도 그러는게 좋다면서.. 갑자기 여러 말을 하시더니.. 어느 순간 선생님의 차를 타고 3D 프린터를 가져와버렸다..

학교에서 집까지 45분 거리인데도.. 심지어 선생님은 반대편 방향인데도.. 선생님은 동아리 팀장이기도 하고 여러 도움을 줬으니 상관없다면서 데려다 주셨는데.. 감사합니다. 선생님..

 

그렇게 가져와보니..

0123

이렇게 진짜로 3D 프린터를 가져와버렸다..

 

3D 프린터 종류는 MakerBot Replicator 5th Generation로 굉장히 비싸고, 내가 어릴 때 진짜 써보고 싶었던 프린터 중 하나였다. (Ultimaker도 써보고 싶다..)

 

진짜 꿈만 같던 3D 프린터를 가져와서 쓸 수 있게 되어서 굉장히 신비하고 행복한 기분이었다.

 

근데 쓰는 방법을 모르는지라 여러번 유튜브를 찾아보기도 하면서 했는데.. 굉장히 특이한 점은 헤더에 필라멘트 튜브를 끼우는 줄 알고 계속 찾아봤었는데.. 결국 아니였었다.. 헤더에서 필라멘트를 끌어당겨서 필요가 없었다.. (엄청 좋네..)

 

일단 그렇게 켜서 여러가지 모드도 확인해보고 계정도 연결하고 있었다. 근데 이상하게 내가 예전에 관심이 있던지라 계정이 만들어져 있었다. ㅋㅋㅋ

 

근데 가장 큰 문제점은 이게 학교에 방치되어있다 보니.. 필라멘트를 엄청 많이 사셨던데.. 모두 오래 안쓰다 보니 습기가 굉장히 많이 차 있었다. 그래서 어떻게 쓰지 하다가.. 내가 가지고 있는 것 중에 필라멘트 건조기도 있었는데.. 하하하 필라멘트 스풀이 너무 커서 안들어가는..

 

그래서 그냥 포기하고 일단 1~2일 동안 필라멘트 보관팩에 넣고 실리카겔로 건조 시켰다. (뭐.. 소용은 없었지만..)

 

근데 진짜 신기한 점은 분명 필라멘트가 습기가 차 있는데도 하나에 5만원 짜리이라서 그런지 거미줄도 하나도 안생기고 엄청 잘 출력이 되었다..

굉장히 놀라웠다.. 이게 비싼 프린터인건가.. 더 신기한 점은 이거가 0.4mm 노즐인걸로 아는데 그것보다 더 높게 바닥을 채우는게 보였다.. 그래서 깨달은건 이 프린터는 출력 두께를 조절하면서 엄청 빠르게 출력할 수 있다는걸 알았다.. (실제로도 그랬었다.. 내 프린터 기준으로 24시간 이상이 걸리는걸 18시간 만에 출력을 했으니..)

 

그리고 3D 프린터를 와이파이하고 연결하니 온라인에서도 3D 프린터를 사용할 수 있는건 진짜 좋은 점이었다.

 

근데 최대 단점은 일단 빌드 플레이트가 히팅 베드가 아니기도 하고 종이 테이프가 붙어 있다보니..(종이 테이프에선 잘 안떨어짐) 기본적으로 라프트를 생성하고 그 위에 하다 보니 필라멘트가 굉장히 낭비 되기도 하고 불필요한 시간이 걸렸었다.. 뭐 난 상관없지만 좀 큰 단점이었다. 

 

그리고 소리도 굉장히 시끄러웠다. 내 프린터는 팬 소리만 나고 모터소리는 하나도 안나는데 이건 진짜 큰 소리로 노래를 불르는 것 처럼 나다 보니.. 모터가 움직이면서 진짜 음정도 나타나고 한.. 20m 떨어져 있는 곳에서 방문을 닫아도 소리가 날 정도 였다.. 뭐 그래도.. 빨르니 상관은 없지만..

 

근데 굉장히 특이한 점은 아까 습기가 있어도 잘 된다 했었는데.. 특이한 점은 내 3D 프린터에 그 필라멘트를 쓰니 거미줄이 왕창 생기고 출력도 잘 안된다는.. 진짜 신기하긴 했다..

 

아 근데 제일 큰 단점은 슬라이서인데.. 슬라이서가 큐라보다 굉장히 느리고 렉이 엄청 걸렸다.. 서포터도 생성을 잘 못하고.. 

 

그래서 난 결심했다. 그냥 Makerbot 프린터는 어른 되도 구매하지 않기로.. 뱀부랩이나 사고 싶다..

 

그렇게 일주일 이상을 출력해서 모든 부품을 출력했다. 나머지로 추가 부품은 내 프린터로 출력할 수 있는 정도라 2023-05-25에 빌리고 2023-06-16에 반납하기로 했다.

 

정리

장점 : 온라인 출력 가능, 빠른 출력, 단순한 UI, 필라멘트

단점 : 소리 엄청 시끄러움, 히팅 베드가 없어 라프트 무조건 출력, 라프트로 바닥면이 고르지 못함, 슬라이서 진짜 별로..

결론 : 어른이 되면 꼭 안사야지..

 

근데 내일 어떻게 학교에 가져가지..

01

반응형
반응형

선언..

https://youtu.be/NOZZMsMAGh0

작년에 여행을 갔었는데.. 그곳에서 이걸 만들어보라 권유를 하셨던 적이 있었다.. 그래서 어쩌다보니 만들겠다 다짐해버려서.. 하하하 만들기를 며칠 전부터 시작했다..

 

일단 만들기 전에 조사부터 했다

https://howtomechatronics.com/projects/diy-mars-perseverance-rover-replica-with-arduino/

 

DIY Mars Perseverance Rover Replica - Arduino based Project

In this tutorial I will show you how I built a replica of the Mars Perseverance Rover. I designed this DIY Mars Rover so that everyone...

howtomechatronics.com

이 곳에 가보니 3D 모델도 공유 되어있고 어느정도 부품 목록도 공개가 되어있었다..

그런데 하하하 일단 모두 다 조사하고 보니깐.. 출력물 제외하곤 약 30만원.. 뭐 일단 어느정도는 가능해서.. 만들기를 시작했다. 윽

 

출력!

일단 부품 목록은 위 사이트에서 있다! 그래서 그걸 다운로드 해보면 메인파츠, 카메라 파츠, 악세사리라 적혀있던데.. 일단 메인파츠부터 출력을 시작했다.

 

총 28개 이고.. 굉장히 오래걸렸다.. 한 일주일 이상은 다 걸린 것 같다. 필라멘트도 3개 거의다 쓰고..

 

012

이런식으로 출력을 했다.. 하나하나가 엄청 갯수가 많다 보니 굉장히 오래걸리긴 했지만.. 메인파츠는 모두 출력했다. 모아보니 이정도?

그래서 일단 출력은 모두 완료되었다! 근데 약간 사이즈가 안맞아서 그런지.. 잘못 끼우면 오래 출력한건데도 쉽게 부러진다는 단점..

 

프레임 조립

처음에는 알리에서 시킬려 했는데 알리에서 보니깐 프레임들이 8000원 이랬다.. 너무 비싸서 네이버 보니깐 엄청 저렴하게 팔고 있었던 것.. 근데 일단 프레임은 이 글을 쓰는 어제 왔다.

근데 프레임을 보니 뭔가 싸한 느낌이 들어서 다시 원문을 보니깐 모델에 실수가 있었나보다..

일단 프레임만 보면 이런데.. 제목에 수치가 있어서 봤더니 382mm가 4개 242mm가 6개 였는데 자세히 안봤었다..

실제로는 382mm 282mm 242mm 인가로 각자 4개 4개 2개 이런데.. 이름 때문에 잘못 사버렸다..

배송비가 엄청드는데 다시 사기는 애매하고 해서.. 일단 조립하고 나중에 부족한 부분은 그냥 출력물로 어떻게든 추가할 생각이다.

 

그래서 일단 왔던 부품을 조립해보니 이런 모양? (아직 덜 조립했지만..)

012345

일단 예상한 것보다 진짜 수치도 잘 맞게 와서 조립이 잘 되었는데.. 부품을 잘 못 사서 아쉬운점은 있었지만..

이대로 계속해서 제작해볼 예정이다.

 

부품을 지금도 추가로 시키고 있고 배송도 오고 있어서 굉장히 긴 프로젝트가 되겠군..

언제쯤 다 만들어질까..

반응형
반응형

오늘 학교에서 머신러닝 과목으로 첫 인공지능을 배웠습니다!

K-최근접 이웃(K-Neighbors Classifier) 알고리즘은 여러 데이터에서 가장 가까운 k개의 이웃을 찾아 다수결로 분류하는 방식의 알고리즘입니다.(아마)

 

어쨋든!

학교에서 수업한 내용은 파이썬으로 되어있지만.. 파이썬은 여러 라이브러리를 통해 쉽게 할 수 있기 때문에.. 이해가 잘 안되는 것 들도 많았습니다..

그래서 최대한 이해하고자 라이브러리가 별로 없는 C++로 진행하고 싶어 만들어봤습니다!

 

Matplotlib을 통해 표시한 그래프
C++ 콘솔 창으로 만든 그래프

일단 하기전에.. 원래는 그래프로 직접 보기 위해 Matplotlib C++를 가져올려 했으나.. 버전이 너무 오래 되어 불가능 했습니다.. 그래서 직접 만들고자 했지만.. 함수화 하는 과정에서 너무 어려워져 제쳐두었습니다. 위 사진은 시도한 흔적입니다.

 

아래 데이터셋을 이용!

bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0, 
                31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0, 
                35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0, 
                500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0, 
                700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]
smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0] 
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]

 

설명을 딱히 하긴 어렵지만.. 일단 구현이 안된건 score()입니다.. 어떤 식으로 구현해야할지 감이 안잡혀서.. 하하;;

 

어쨌든 아래 코드를 오늘 수업한 내용 과정 그대로 C++로 옮겨보았습니다! 2개의 데이터와 1개의 정답으로 벡터를 만들어 2개의 데이터와 예측 데이터로 유클리드 거리를 사용해서 거리 값을 구해 k개의 가까운 거리 값을 뽑아 어떤 것이 더 큰지 찾는 코드입니다!

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;

//거리 기준으로 오름차순 정렬을 하기 위한거
bool cmp(vector<double> x, vector<double> y) {
	return x[3] < y[3];
}

int main() {
	//데이터 정의
	vector<double> bream_length = { 
		25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0,
		31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0,
		35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0 
	};
	vector<double> bream_weight = {
		242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0,
		500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0,
		700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0 
	};
	
	vector<double> smelt_length = {
		9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0
	};
	vector<double> smelt_weight = {
		6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9
	};

	vector<double> length, weight;

	//bream과 smelt 데이터를 나란히 이어 붙이는 코드
	length.insert(length.end(), bream_length.begin(), bream_length.end());
	length.insert(length.end(), smelt_length.begin(), smelt_length.end());

	weight.insert(weight.end(), bream_weight.begin(), bream_weight.end());
	weight.insert(weight.end(), smelt_weight.begin(), smelt_weight.end());

	//length와 weight 데이터를 하나의 자료형에 때려 박는거
	vector<vector<double>> fish_data;
	
	for (int i = 0; i < length.size(); i++)
		fish_data.push_back({ length[i], weight[i] });

	//확인용
	if(0) 
		for (int i = 0; i < length.size(); i++)
			cout << fish_data[i][0] << "\t" << fish_data[i][1] << endl;

	//정답 데이터 생성
	vector<int> fish_target;
	for (int i = 0; i < bream_length.size(); i++) fish_target.push_back(1);
	for (int i = 0; i < smelt_length.size(); i++) fish_target.push_back(0);

	//확인용
	if (0)
		for (int i = 0; i < fish_target.size(); i++)
			cout << fish_target[i] << " ";

	//kn 모델 정의(그냥 데이터와 정답데이터 붙이는거임)
	int k = 5;
	vector<vector<double>> kn;
	for (int i = 0; i < fish_data.size(); i++)
		kn.push_back({ fish_data[i][0], fish_data[i][1], double(fish_target[i]) });

	//확인용
	if (0)
		for (int i = 0; i < length.size(); i++)
			cout << kn[i][0] << "\t" << kn[i][1] << "\t" << kn[i][2] << endl;

	//예측
	//30, 600으로
	double p1 = 30, p2 = 600;
	
	//유클리드 거리 공식을 이용해서 거리를 구하고 kn벡터에 삽입하고 거리 기준으로 정렬하여 상위 k개를 뽑아서 누가 더 큰지 비교한다.
	for (int i = 0; i < kn.size(); i++)
		kn[i].push_back(sqrt(pow((kn[i][0] - p1), 2) + pow((kn[i][1] - p2),2)));
	
	sort(kn.begin(), kn.end(), cmp);

	//확인용
	if (true)
		for (int i = 0; i < length.size(); i++)
			cout << kn[i][0] << "\t" << kn[i][1] << "\t" << kn[i][2] << "\t" << kn[i][3] << endl;

	int bream_c = 0, smelt_c = 0;
	for (int i = 0; i < k; i++) {
		(kn[i][2] == 1 ? bream_c++ : smelt_c++);
	}

	cout << (bream_c > smelt_c ? "이건 bream임" : "이건 smelt임") << endl;
}

위 코드를 실행한 결과

암튼 끝!

반응형
반응형

OpenCV와 Dlib로 프로젝트를 제작 중에..

기이한 현상이 발견됬다..

 

cv::Mat CVImage = dlib::toMat(DlibImage);
cv::cvtColor(CVImage, CVImage, cv::COLOR_RGB2BGR);

여기에서 저 2개의 명령어를 본다면.. 첫번째 명령어는 DlibImage를 OpenCV의 Mat 이미지인 CVImage로 바꾸는데..

보통 이렇게 바꾸면 RGB 이미지가 CVImage에 할당이 된다..

그런데 내 프로젝트가 전체적으로 BGR이다 보니깐.. RGB를 BGR로 변환을 해야해서 cvtColor로 RGB에서 BGR로 바꾸는 명령어를 쳐서 실행했는데..

 

이상하게 첫번째에 실행하면 괜찮다가.. 두번째에 실행하니깐 RGB가 RGB로 출력되는 것이다..

이유는 잘은 모르겠지만.. cvtColor가 오류를 일으켰거나 RGB와 BGR이 서로 할당되고 그러면서 충돌이 일어난 것 같다.. 난 cvtColor에 문제가 있는 것 같다 생각은 든다..

 

즉 실행하면 실행할 수록 BGR > RGB > BGR > RGB > BGR 이런식으로 계속 번갈아가며 출력되는 것..

 

그래서 내가 해결한 방법은.. 애초부터 RGB이미지를 안쓰기로 해서.. 그냥 이미지 변환안하고 바로 썼다..

그러니깐 잘된다..

 

으음..

아직도 뭔 문제인지 모르겠다.. RG를 BGR로 바꿀때의 문제들은 해외 커뮤니티에서 보긴 했는데..

 

내 OpenCV 버전이 낮아서 그런건가.. 그래도 최신껄로 깔았는데.. 뭐가 문제인건지..

 

해결했던 방법..

그냥 RGB 안쓰고 애초에 처음부터 BGR로 되게 작업..

반응형
반응형

프로젝트 제작중에 

cv::Mat A, B;
A = B;

이렇게 B의 이미지 데이터를 A로 넘기는걸 써봤다..

근데 문제가 생긴다..

 

나중에 A의 이미지를 다른걸로 바꾸면 B가 이상하게 바뀐다는 것이다..

분명 B의 이미지를 A로 넘기는 것 밖에 안했는데 바뀌는..

 

그래서 ChatGPT에 물어보니 이미지 데이터를 보내는게 아니고 참조를 한다고 한다.. 대충 A와 B는 같은 메모리를 사용하게 하는 그런건가..? 암튼 저렇게 하면 A가 B의 이미지 데이터를 참조하도록 되기 때문에.. A를 바꾸면 B가 같이 바뀌는 것이였다.. 으으

 

그래서 해결 방법은 2가지가 있는데

cv::Mat A, B;
A.copyTo(B);

이렇게 하는 방법이 있다. A의 이미지 데이터를 B로 넘긴다는 뜻!

또 다른 방법은

cv::Mat A, B;
B = A.clone();

A의 이미지를 복제해서 B로 넣는 것..

 

근데 난 의미상으론 복사를 써야하기 때문에.. 첫번째 방법으로 썼다..

암튼 끝!

반응형

+ Recent posts