일단 바로 제작된 결과!
음 얼굴을 찾아서 뭔가 하는 프로젝트를 하는데 문제가 생겼다. 얼굴 이미지를 벡터로 변환하는 과정에서 원본 이미지와 얼굴 이미지를 보여줄려 하는데 여기에서 원본 이미지를 보여줄 때 보여주는 곳이 정사각형이다..
근데 OpenCV에서 이미지를 바로 넣을려니깐 이미지를 리사이즈 해서 바로 넣는 것은 좀 불편하고.. 이미지를 정사각형에 맞춰 그냥 리사이즈 하면 이미지가 뭉개지고..
그래서 생각한건 흰 배경 중심에 이미지를 넣는 것인데
이걸 해결하기 위해 1시간 반이 걸렸다..
대충 생각을 해본건
- 원본 이미지 보여주는 곳과 같은 크기의 배경을 만들어 중앙에 이미지를 배치
- 원본 이미지의 가장 긴 변의 길이 대로 정사각형 배경을 만들어 중앙에 이미지를 배치
이런거고 중앙에다 배치할땐
- 비율에 맞춰 원본 이미지를 축소해서 정사각형 배경의 반에 원본 이미지의 짧은 변의 반을 빼서 위치 구하기
- 정사각형 배경의 반에 원본 이미지의 짧은 변의 반을 빼서 위치 구하기
등을 생각했는데.. 난 여러가지 방법을 생각해보고 여러가지 방법을 해보다가 헷갈리기도 하고 수정하기도 하며 결국엔
원본 이미지의 가장 긴 변의 길이 대로 정사각형 배경을 만들어 중앙에 이미지를 배치할 때 정사각형 배경의 반에 원본 이미지의 짧은 변의 반을 빼서 위치를 구해서 바로 넣는 방법을 하기로 결정했다..
그래서 이걸 대충 이미지로 표시하면!
이런식으로
일단 정사각형이면 그냥 패스
가로가 더 길 경우 가로 길이에 대한 정사각형을 만들고 그게 검은색 사각형!
거기에 빨간색이 원본 이미지꺼..
그래서 파란색 동그라미 부분의 위치를 구하는건데
검은색 사각형에서 반을 나누고 거기에서 빨간색 사각형의 반을 빼면 저 위치가 나올 것 같다 라는 생각이 들어서 한 것!
파란색은 반대로 생각하면 되는거!
대충 식은
(Square / 2) - (OriginalImg / 2)
뭐 어쨌든 이런 방법으로 코드를 구현한 결과!
if (I_celeb_img.nc() == I_celeb_img.nr())
GUICon::putWebcamView(I_celeb_img, preSetImage);
else {
int squareLen = (I_celeb_img.nc() < I_celeb_img.nr() ? I_celeb_img.nr() : I_celeb_img.nc());
cv::Mat originalViewImage(squareLen, squareLen, CV_8UC3);
originalViewImage = cv::Scalar(0xFF, 0xFF, 0xFF);
//배경 이미지 중앙에 사진 넣기
//사진의 세로가 가로보다 짧을 경우 squareLen의 길이에서 반을 나누고 이미지 세로의 반 만큼 빼서 좌표 구하기
if (I_celeb_img.nr() < I_celeb_img.nc()) { //가로가 더 클 경우 같을 경우 비교 안하는건 위에서 이미 해서
int ypos = (squareLen / 2) - (I_celeb_img.nr() / 2); //세로가 짧을 경우 정사각형의 한 변의 길에서 이미지 세로 반을 빼서 위치 구하는 것
CPputImage(I_celeb_img, originalViewImage, cv::Rect(0, ypos, I_celeb_img.nc(), I_celeb_img.nr()));
}
else {
int xpos = (squareLen / 2) - (I_celeb_img.nc() / 2); //위와 반대
CPputImage(I_celeb_img, originalViewImage, cv::Rect(xpos, 0, I_celeb_img.nc(), I_celeb_img.nr()));
}
cv::cvtColor(originalViewImage, originalViewImage, cv::COLOR_RGB2BGR);
GUICon::putWebcamView(originalViewImage, preSetImage);
}
코드는 이렇다!
여기에서 CPputImage는 그냥 OpenCV 이미지의 특정 위치에 이미지를 넣는 함수고
GUICon::putWebCamView는 원본 이미지 표시하는 쪽에 이미지 넣는 함수다.. 암튼 그럼!
그럼 끝!
'개발 > C++' 카테고리의 다른 글
Tobii Eye Tracker으로 VRChat 눈 제어 해보기! (0) | 2024.08.29 |
---|---|
C++ OpenCV 영어 말고 한국어 출력하기 +안티에일리어싱 (WINDOWS만) (2) | 2022.12.17 |
C++ 그래픽으로 푸리에 급수의 뭔가를 그려보기 (0) | 2022.09.14 |
프로그래머스 (PROGRAMMERS) 1단계 스킬 체크 통과 (0) | 2022.08.21 |
YOLO V5를 C++로 돌려보았다! (1) | 2022.07.29 |