1

그림에서 각 개체의 경계 상자를 찾고 싶습니다. 발견 한 후에 경계 상자를 잘라서 다음 단계에 사용합니다. Here is the input picture after preprocessing. 경계 상자에 대한 코드가 있지만 객체 1 개에서만 제대로 작동합니다. 객체가 2 개있는 경우 두 객체의 합계를 계산하고 둘 다에 경계 상자를 그립니다. Here is the first output. 그것의 코드는 다음과 같습니다 I 시도테두리 상자가있는 개체 찾기

vector<vector<Point>> contours; 
vector<Point> points; 
findContours(erod, contours, CV_RETR_LIST, CV_CHAIN_APPROX_NONE); 
for (size_t i = 0; i < contours.size(); i++) { 
    for (size_t j = 0; j < contours[i].size(); j++) { 
     Point p = contours[i][j]; 
     points.push_back(p); 
    } 
} 
if (points.size() > 0) { 
    Rect brect = boundingRect(Mat(points).reshape(2)); 
    cv::rectangle(erod, brect.tl(), brect.br(), Scalar(100,100,200), 2, CV_AA); 
    Mat ROI = frame(brect); 
} 

secound 것은 OpenCV의의 문서의 코드를 사용했다. 여기서 CV_RETR_TREE를 findContours에서 CV_RETR_EXTERNAL로 바꿨지 만 여전히 많은 경계 상자에 도달하고 상자를 잘라내는 방법을 모르겠습니다.

고맙습니다.

답변

1

윤곽을 발견하기 전에 모든 소음과 라인을 취소 몇 가지 형태 개방을 수행해야합니다

Mat morphKernelOpen = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, new org.opencv.core.Size(20, 20)); 
Imgproc.morphologyEx(mat, mat, Imgproc.MORPH_OPEN, morphKernelOpen); 

결과 : enter image description here

는 또한, 그래서 피하기 위해, 당신의 객체 내부의 검은 색 공백이 윤곽선을 찾으려면 findContours 함수가 모드 아래에 있어야합니다.

Imgproc.findContours(scharrThresh, scharrThreshContours, new Mat(), Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); 

결국 두 개의 윤곽이 생기고 이전처럼 상자를 찾을 수 있습니다.

오브젝트 주변의 부드러운 가장자리가 마음에 들지 않으면 형태 학적 열기 전에 임계 기능을 사용할 수 있습니다. 물체 주위에 100 % 정확한 윤곽선을 얻는 것은 이미지에서 너무 많은 노이즈로 인해 매우 어렵거나 거의 불가능합니다. 또한 가능한 경우 다음 번에 결과 이미지를 넣으라고 요청하면 다음 단계로 넘어 가서 적절한 답을 제공하기가 더 쉬워집니다.

+0

도움 주셔서 감사합니다. 나는 다음 번에 그것을 명심 할 것이다. 이제 작동합니다! – Mani

+0

내가 준이 코드는 자바 언어로되어 있다는 것을 잊어 버렸습니다. Java에서 opencv의 클래스는 이름이 약간 다르므로 어떤 어려움이 있었는지 사과드립니다. 통합하기 쉽고 아직 undestand 아직하지 않은 경우, –

+1

아무 문제 없어 나는 그것을 이해하고 내 코드에서뿐만 아니라 그것을 사용합니다. 고맙습니다 :) – Mani