-
[OpenCV & C++] flip을 사용할 때 이미지가 반 갈라지는 문제 해결Computer Vision & AI/OpenCV 2022. 11. 17. 18:47
오늘은 코딩중에 만난 특이 케이스를 기록해보겠습니다.
Gpu를 사용해 image를 flip할 때 나타난 현상입니다.
flip함수에 대한 설명은 OpenCV 기초 - 2. 영상처리 준비(2) (tistory.com)
여기 잘 정리된 블로그글 참조하시면 좋습니다.
여기서는 해당 문제만을 다루겠습니다.
위 사진을
cuda::flip(srcGpu, srcGpu, -1);
함수를 사용해서 출력했다.
cuda::flip(src,dst,code)
code는 어느 방향으로 뒤집을지 알려주는 파라미터
결과는
code = -1 은 상하좌우 flip이므로 180도 회전과 같다.
그런데 결과는 이상하게 반만 되어버렸다.
원인은 dst자리에 src를 반복해서 넣었기 때문이다.
왜 저런 현상이 발생했는지 궁금해졌다...!!!!!
OpenCV document를 찾아보았다.
수식부분을 살펴보면 답이 나온다.
flipcode = 0 이면 x축을 가운데에 두고 반전을 시킨다. (상하반전)
만약 flip(src, src, 0)을 사용하면 아래처럼 된다.
i = 0 일 때,
src의 (rows-1,j)자리에 있는 픽셀이 dst의 (0,j)로 이동하게 된다.
(맨 아랫줄 픽셀이 맨 첫 줄 픽셀로)
i가 rows-1값 까지 증가하면서 계산을 하게 되는데, 이 때 중간rows값부터 문제가 생긴다.
이미지 사이즈는 거의 짝수로 설정되니, rows를 짝수라고 가정하자.
rows=10인 이미지가 있다면
for( i = 0; i<10; i++)로 돌려보자.
i = 0, r = 10 - 0 -1 = 9
i = 1, r = 10 - 1 -1 = 8
9번째 row → 0번째 row
8번째 row → 8번째 row
⁝
5번째 row → 4번째 row (중간row)
4번째 row → 5번째......어라라....! 4번째를 보내려고 했는데 바로 이전에 이미 flip되어버린 녀석이다.
그래서 5~9번째 줄은 이미지가 원본 그대로 출력하게 된다.
따라서, 원본을 뒤집고 싶다면 flip(src,src,code)로 사용하지 말고
Mat을 하나 생성해서 flip(src,dst,code)로 사용하도록 하자! ☜(゚ヮ゚☜)
'Computer Vision & AI > OpenCV' 카테고리의 다른 글
YOLO C++ detect 에러 (C2664) (0) 2022.11.09 [OpenCV, C++] alpha 채널이 있는 이미지 합성(블랜딩) 오류 해결 (0) 2022.06.14