C# OpenCVSharp의 Mat에서 원하는 부분만 자르는 법을 알아보자. C++에서 작성된 Hand Eye Calibration을 C#으로 옮기는 과정에서 Mat에서 ROI를 따는 방법이 C#에는 따로 없는 것 같아서 찾아봤다.
C++
C++에서는 간단하게 Mat(Rect)를 해주면 된다. 이렇게 하면 원본의 이미지 사이즈도 유지되면서 해당 Rect 위치에 원하는 자료가 들어간다.
Mat img = imread("Lenna.png", 1);
Mat img_roi_1, img_roi_2;
img_roi_1 = img(Rect(200, 200, 100, 100));
img_roi_2 = img(Rect(Point(300, 200),Point( 400, 300)));
C#
C#에서는 위와 같은 방법으로 하면 에러가 발생한다. 그래서 Clone에서 Rect도 해보고 이것 저것 다 해봤는데 잘 안됐다. StackOverFlow에서도 찾아보고 열심히 구글링을 해본 결과 한 일본 사이트에서 방법을 찾았다.
바로 Mat[Rect]를 하면 된다.
Mat tmp = new Mat("original.jpg"); // Size: 200,200
Rect rect = new Rect(0,0,200,200);
Mat image = Mat.Zeroes(4,4, MatType.CV64F1);
tmp.CopyTo(image[rect]);
이런 식으로 작성하면 되는데, 중요한 점은 Rect의 크기와 덮어씌우고자 하는 이미지의 크기가 같아야 한다. 크기가 다르면 아예 값이 들어가지 않는다. C++에서 사용하는 방법에 비해 귀찮은데, 왜 C#에서는 똑같이 래핑이 안되어있는지 모르겠다. 이미지의 특정 부분을 덮어 씌우거나, 아니면 카메라 및 로봇 보정 과정에서 행렬을 붙혀넣을 때 알고있으면 편한 방식이다.
'🔑컴퓨터 유용한 정보' 카테고리의 다른 글
에어컨 전기세 계산 방법 (하루 종일 틀면 얼마가 나올까?) (0) | 2022.07.04 |
---|---|
LG 휘센 에어컨 고장 증상 및 수리 방법 LED 깜빡임 (0) | 2022.06.15 |
TV 안전하게 닦는 법 (LED, LCD, OLED TV) (0) | 2022.02.24 |
TV를 모니터로 사용하는 방법 (0) | 2022.02.23 |
외장 하드 고장났을 때 해결 방법 (인식 불가) (0) | 2022.02.22 |
댓글