반응형

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로 넣는 것..

 

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

암튼 끝!

반응형
반응형

학교에서 내준 프로젝트를 계속 만들기 위해 방학에도 계속 이어나가고 있다.

그런데 만들다가.. Dlib에서 deserialize라는 함수에 모델 파일을 넣을 때 오류가 난 것이다..

 

왜 그런가.. 하는데 debug 모드에선 this가 nullptr를 가르키고 있다 하고 release 모드에선 예외가 발생했다 하고..

예외 발생(0x00007FF69400D3D3, program.exe): 0xC0000005: 0x0000000000000008 위치를 읽는 동안 액세스 위반이 발생했습니다..

이런식으로..

그래서 뭔 문제인가 보니..

 

이전 프로젝트 같은 경우 정상적으로 됬는데 이번꺼만 안되었다..

왤까 하고 생각해보니 이전껀 포인터를 몰라서 안썼는데 이번껀 포인터를 좀 써봐서 안됬던 것 같은 생각이 떠올랐다..

 

그래서 포인터로 변수 만들때 * 기호를 제거하니.. 되네.. 하하하하하 왜 이걸로 2일을 존버 탄걸까..

 

dlib::shape_predictor* sp;

dlib::deserialize(spPath) >> *sp;

이런식으로 변수를 생성하고 deserialize로 모델을 로드하니 안됬었다..

그래서 그냥 포인터를 제거하니깐 아주 잘된다.. 하하하하하하

 

그래서 난 이런식으로 주석을 했다.

//이거 모델 로드 할때 포인터 쓰면 오류남
dlib::shape_predictor sp; //68점 찍는거

if (modelFileCheck(spPath))
	//dlib::deserialize(spPath) >> sp;

 

요약

Dlib에서 모델 파일 불러올 때 (dlib::deserialize) 이걸로 뭔 이상한 오류 뜨면 포인터를 제거해봐야 한다..

 

(근데 아직도 포인터의 정확한 개념과 사용방법은 몰라서 저게 왜 되는지도 모르겠다.. 흐으억)

반응형
반응형

빠른 해결 방법은 아래로 내려가세요! 해결 방법

 

으윽 Visual Studio에서 QT로 프로젝트를 개발하는 도중에.. 한글이 깨지는 현상이 발견되었다..

그리고 한글을 쓴 상태에서 빌드를 해보니

오류 C2001 : 상수에 줄 바꿈 문자가 있습니다.	
오류 C2146 : 구문 오류: ')'이(가) 'M_FaceCount' 식별자 앞에 없습니다.
오류 C2146 : 구문 오류: ';'이(가) 'M_FaceCount' 식별자 앞에 없습니다.

뭐 이런식으로 오류가 떴다..

이게 문제인 것 같은데.. 난 분명 줄 바꿈 문자를 넣지도 않았는데 저래 뜬다..

그리고 겨우 빌드 해도..

이런식으로 알 수 없는 문자로 뜨는 것이다..

 

그래서 예전에 생각해보니 비슷한 문제가 있어 인코더 문제인가 하고 인코더를 바꿔보니 되는 것이다!

해결방법

문제가 일어나는 파일을 선택 후 "파일 > 다른 이름으로 이름.cpp 저장(A)..."

저장하는 파일 목록이 뜨면 아래에서 저장 바로 오른쪽에 아래로 내리는 삼각형 표시 클릭

그러면 이렇게 인코딩하여 저장(V)... 이 뜨는데 이걸 눌러야 합니다!

글고 파일을 바꿀껀지 묻는데 인코더를 바꿔야 함으로 당연히 바꾸기 클릭!

그럼 이런식으로 뜨는데 여기에서 인코딩이 보통 한국어 - 코드 페이지 949로 뜨는데 이걸 유니코드(서명 없는 UTF-8) - 코드 페이지 65001로 바꿉니다! (보통 Visual Studio에서 저장하면 EUC-KR로 저장되는 것 같습니다.)

그리고 확인을 눌러 저장!

그러고 난 후에 다시 빌드해보면 어떤 문제도 발생하지 않고 정상적으로 글자가 표시됩니다.

그리구! 일본어도 가능!

뭐 어쨌든 이런 것이고.. 분명히 항상 이 설정을 하는 것은 불편하죠..

그러니 바꿔보죠!

(Visual Studio Code는 인코딩 자동 설정으로 바로 되던데..)

Visual Studio 기본 인코더 설정

이 방법은 프로젝트마다 설정해야되니.. 불편하긴 하지만.. 어쨌든 되니 뭐 암튼

일단 프로젝트 파일로 들어갑니다.

프로젝트 파일은 솔루션 폴더 안에 있습니다.

즉! 보통 프로젝트를 만들면 솔루션 이름을 지정하고 프로젝트 이름을 지정하게 되는데

source > repos > 솔루션 이름 > 프로젝트 이름 이런식으로 저장되는데 여기에서 우리가 해야할 작업은 프로젝트 이름 쪽 폴더 입니다.

 

프로젝트 폴더엔 vcxproj 파일이나 cpph 파일을 작성했던 모든 코드들을 볼 수 있는 폴더인거죠

뭐 암튼 여기에서 

이런 파일을 ".editorconfig"생성합니다. 전 그냥 바로 메모장 파일 생성하고 이름하고 확장자 전체 다 바꿨습니다.

그리고 그 안에 이렇게 작성합니다.

root = true

[*]
charset = utf-8

그리고 저장하면 끄읕!

 

그리고 이제 Visual Studio에서 파일을 생성해보면?!!

기존에 있던 파일 인코더
.editorconfig 설정을 한 후 생성한 파일 인코더

이런식으로 바뀌었습니다!

어렵네요..

요약

파일 > 다른 이름으로 이름.cpp 저장(A)... > 저장 오른쪽 삼각형 클릭 > 인코딩하여 저장(V)... > 인코딩(E): 아래 메뉴에서 유니코드(서명 없는 UTF-8) - 코드 페이지 65001 이걸로 변경

 

항상 UTF-8로 자동저장 방법

프로젝트 폴더로 진입 > .editorconfig 파일 생성 > 아래 코드 입력 후 저장

root = true

[*]
charset = utf-8

 

 

.editorconfig 설정 관련 사이트

https://editorconfig.org/

 

EditorConfig

What is EditorConfig? EditorConfig helps maintain consistent coding styles for multiple developers working on the same project across various editors and IDEs. The EditorConfig project consists of a file format for defining coding styles and a collection o

editorconfig.org

근데 왜이리 중간 중간 말투가 바뀌는거지..

반응형
반응형

잘은 모르겠지만 아마 프로젝트에서 라이브러리 끼리 런타임이 달라서 그러는 것 같다.

불일치가 검색되었습니다. 뒤에 Mt 뭐시기 값이 Mtd 뭐 이런식으로 안맞다는데

그냥 맞추면 끝나는 문제!

 

프로젝트 오른쪽 클릭 > 속성 > ("프로젝트 이름" 속성 페이지) 에서 구성 속성 > C/C++ > 코드 생성 > 런타임 라이브러리

이걸 맞춰주면 된다. 

내가 맞춘 방법으로는 

오류에서 MT_StaticRelease 값이 MD_DynamicRelease 뭐 이런식으로 떴었는데 MD_DynamicRelease 쪽꺼가 내 프로젝트꺼고 MT_StaticRelease가 라이브러리 쪽 같아서 그냥 내 프로젝트를 MT_StaticRelease쪽에 맞췄다. 그냥 런타임 라이브러리 설정에서 MDMT로 바꾼거

이런식으로

 

요약하면 

'RuntimeLibrary'에 대해 불일치가 검색되었습니다. 'MT_StaticRelease' 값이 'MD_DynamicRelease'(프로젝트 이름.obj에 위치) 값과 일치하지 않습니다.

이럴 때 프로젝트의 속성 페이지에서 구성 속성 > C/C++ > 코드 생성 > 런타임 라이브러리MT로 바꿔주면 끝!

 

그리고 더 찾아본 것인데.

MT정적 라이브러리로 연결해서 dll 파일로 동적으로 연결하지 않고 exe에 다 넣어서 정적으로 실행되게 하고

MD동적 라이브러리로 연결해서 dll 파일이 필요한 건데..

https://cheongpark.tistory.com/16

 

DLIB & OPENCV 진짜 쉽게 깔아보기 C++

학교에서 프로젝트를 받아버려서.. 해야하는 상황.. 내 프로젝트를 위해선 DLIB와 OPENCV가 필요한데.. 정말 2~3일동안 수없이 도전해보다가 굉장히 간단한 방법을 찾아서 알려줄까함! (왜이리 dlib는

cheongpark.tistory.com

여기에서 DlibVCPKG로 깔았었는데 난 이때

이 항목이 있어서 그냥 깔아봤다. 근데 여기에 필요한 거였다..

VCPKG로 깔은 것도 정적 라이브러리로 가능한가보다..

 

그래서 속성 페이지로 들어가보니 VCPKG라는 항목이 있는데 거기에 자세히 보니 Use Static Libraries 이런게 있었다.

그래서 정적 라이브러리로 만드는건가 해서 예로 바꿨더니..!

빌드 해서 보니 원래는 사진에 관한 dll 파일들도 막 생기고 그랬는데..

이젠 안생긴다!

다만 윈도우 버전에 따라 필요로 하는 dll 파일들은 생기지만..

 

뭐 어쨌든 더 좋아진 것 같다!

 

암튼 끝

반응형
반응형

QT를 빌드하고 실행해보면 이상하게 제목처럼 Qt6Core.dll Qt6Gui.dll Qt6Widgets.dll 이 세개의 파일이 없다면서 실행을 거부해버린다.

뭐 저걸 찾아서 넣으면 된다만.. 도데체 어딨지 했다는..

 

그래서 찾아보니 다른 사용자들도 사용할 수 있게 배포를 하기 위한 명령어가 있었다는걸..

windeployqt

이거

 

자신이 QT 프로젝트를 만들 때 사용했던거.. Visual Studio로 했으면 MSVC 2019 이런거..

어쨌든 설치했다면 Qt 버전 (설치 된거) 뭐 이런식으로 뜰꺼다..

내껀 이렇게 

그래서 이걸 실행해서 여기에다가 windeployqt "exe 파일 경로" / 예) windeployqt "C:\Users\Deploy\QtProject.exe" 이런식으로 입력하면

엄청난 여러가지 문구가 뜨면서

대충 이거하고 여러가지 dll 파일들을 생성하면서 다른 컴퓨터에서도 구동할 수 있게 파일을 만들어준다..

 

근데 문제는 엄청 귀찮다.. 그리고 명령어가 생각 안날 때도 있다.

 

그래서 Visual Studio 경우 설정을 찾아보니

Qt Project Setting > Run Deployment Tool 이 있었다.

이걸 이용하면 될 것 같아.

어차피 테스트는 디버그에서 할꺼라 Release에서 하는 경우는 배포용으로 빌드 할 때 밖에 없기 때문에

 

구성을 Release로 하고

이런식으로 예로 바꾸니

 

바로 빌드 하자마자 windeployqt 이 명령어 없이 바로 배포 파일들을 생성해주었다..!

근데.. 자주 테스트로 컴파일 해보는 거에다가 저걸 하는건 않좋을 것 같다.. 너무 느려..

 

뭐 어쨌든 요약!

3가지 파일이 없는 이유는 배포 툴로 파일들을 생성 안한 것이며 생성을 간편하게 할려면 Visual Studio의 경우 속성 페이지로 가서 구성 속성 > Qt Project Setting > Run Deployment Tool로 바꿔주면 Release로 빌드 할 때마다 배포 파일로 자동으로 만들어줌!

아니면 windeployqt "exe 파일 경로" 이 명령어로 해도 상관없음!

반응형
반응형

CVUI를 사용하여 OpenCV의 사진에다가 UI를 넣을려고 하는데

내가 코드에 쓰는 CVUI 함수들 마다 다 저딴 오류가 뜬다..

 

이거 그냥 간단하게 해결이 가능하다.

 

해결

상단에 #define "cvui.h" 하기전에 #define CVUI_IMPLEMENTATION이것만 추가하면 된다.

 

#include "cvui.h"

이걸 이렇게

#define CVUI_IMPLEMENTATION
#include "cvui.h"

 

요약

그냥 cvui.h 가져올 때 그 위에 "#define CVUI_IMPLEMENTATION" 이거 추가하기

반응형
반응형

내가 문제 생겼을 때 보기 위한 오류해결

  • C2146 : ';'이(가) 'pixel_type' 식별자 앞에 없습니다. 
  • C2027 : 정의되지 않은 형식 'dlib::image_traits<image_type>'을(를) 사용했습니다.
  • C4430 : 형식 지정자가 없습니다. int로 가정합니다. 참고: C++에서는 기본 int를 지원하지 않습니다.

일단 저기 Don't add anymore은 그냥 지금 프로젝트를 계속 여러번 테스트하며 하고 있어서 더 이상 추가안한다는 것

 

Dlib 라이브러리를 쓸 때 가끔 이래 뜬다..

이 오류는 내 문제에 대한건 그냥 dlib에 이미지 파일을 넣을 때 그 함수의 지원되지 않는 이미지 변수를 넣어서 그런 것 같음..

 

해결

해결 방법은 그냥 dlib가 지원하는 이미지 변수로 넣으면 아마 될 것이다..!

auto face = detector(camImg);

내 경우 얼굴 인식 때문에 하고 있는데

현재 저 camImg가 OpenCV의 Mat 자료형이다.

 

근데 Dlib에서 OpenCV의 자료형을 넣어버리면 분명 오류를 낼꺼다.. 자기꺼도 아닌데 (왜 넣냐고 나보고 어쩌라고..) 할 것이다.

그래서 간단하게 해결할려면 Dlib에서 지원하는 자료형으로 변환하면 되는 것임!

dlib::cv_image<dlib::bgr_pixel> cimg(camImg);
auto face = detector(camImg);

이렇게 하면 되는 것임..!

dlib의 cv_image가 OpenCV의 이미지를 Dlib의 매트릭스로 바꿔주는 그런 것인 듯

 

어쨋든 그런 것임!

 

요약

Dlib가 지원하는 자료형으로 이미지 넣으면 됨

반응형

+ Recent posts