본문 바로가기
opencv

(opencv) Rectangle 간의 조작에 관해

by 꼰대코더 2023. 11. 23.

cv:: findContours() 나 cv::connectedComponentsWithStats() 에 의한 오브젝트를 찾아서 rectangle로 표현하기도 한다.

결함을 검출하는 시스템이라면 결함부분을 rectangle로 표시를 하는데 가까운 결함들은 통합하기도 하기때문에 도움이 되리라고 생각한다.

 

아래와 같이 두개의 cv::Rect 가 있을 경우, 

  1.  A B 가 교차하고 있는지 확인
cv::Rect rectA = cv::Rect(50, 50, 100, 50);
cv::Rect rectB = cv::Rect(200, 80, 70, 50);

if ((rectA & rectB).area() > 0)
   // 붙어 있음
else
   // 떨어져 있음


2. A B 를 통합

cv::Rect rectAB = rectA | rectB;

3. A 와 B의 거리가 100 픽셀 이내에 있는지 확인

cv::Point pt(-100, -100);
cv::Size sz(200, 200);

rectA += pt;
rectA += sz;

if ((rectA & rectB).area() > 0)
   // rectB 가 rectA 의 100 픽셀 확장과 겹침
else
   // 안겹침

4. 조작하고자 하는 rectangle이 이미지 범위내에 있는지 확인

// cv::Mat image 가 이미지를 담고 있다고 하면

// 이미지 전체 사이지
cv::Rect imgRect(0, 0, image.cols, image.rows);

// 액세스할 이미지 일부분
cv::Rect rect(-100, 30, 200, 200);

// 아래의 경우는 예외가 발생
// cv::Mat part = image(rect)

// 예외 발생을 방지하려면
// if (rect.x >= 0 && rect.y >= 0 && (rect.x + rect.width) <= image.cols ....
// 위에 같이 하려면 번거롭기 때문에 아래와 같이 간단하게 처리하자.
rect = (rect & imgRect);

'opencv' 카테고리의 다른 글

스캔문서의 기울기 알아보기  (0) 2023.11.26
(opencv) 이미지 저장형태, 액서스  (1) 2023.11.25
(opencv) pixel access time  (0) 2023.08.09
(opencv) Mat 의 기초  (0) 2023.08.05
(opencv) 환경설정  (0) 2023.08.05