opencv
(opencv) Rectangle 간의 조작에 관해
꼰대코더
2023. 11. 23. 21:48
cv:: findContours() 나 cv::connectedComponentsWithStats() 에 의한 오브젝트를 찾아서 rectangle로 표현하기도 한다.
결함을 검출하는 시스템이라면 결함부분을 rectangle로 표시를 하는데 가까운 결함들은 통합하기도 하기때문에 도움이 되리라고 생각한다.
아래와 같이 두개의 cv::Rect 가 있을 경우,

- 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); |