Pergunta

Estou tentando desenhar contornos em torno de blobs em uma imagem binária, no entanto, às vezes, o OpenCV desenha um único contorno em torno de duas bolhas distintas. Abaixo está um exemplo. Como posso resolver esse problema?alt text

Aqui ele deve desenhar duas caixas delimitadoras para a bolha à direita e separadamente para a esquerda. Eu concordo que eles estão próximos, mas a distância suficiente entre eles. Estou apenas desenhando contornos externos em vez da árvore ou lista. Também estou usando o CVFindNextContour (ContourScanner), pois essa é uma implementação mais fácil para o meu caso.

Obrigado

Editar: a imagem exibida na janela "Saída" é de uma função diferente que apenas a subtração de imagem. A imagem exibida na janela "Contours" está na função pplfind (). A imagem "saída" é passada para img_con ().


IplImage* img_con(IplImage* image){
    int ppl;
    CvMemStorage* memstr = cvCreateMemStorage();
    IplImage* edges = cvCreateImage(cvGetSize(image),8,1);
    cvCanny(image,edges,130,255);
    CvContourScanner cscan = cvStartFindContours(image,memstr,sizeof(CvContour),CV_RETR_EXTERNAL,CV_CHAIN_APPROX_NONE,cvPoint(0,0));

ppl = pplfind(cscan,cvGetSize(image));
if (ppl !=0 )
    printf("Estimated number of people: %d\n",ppl);
cvEndFindContours(&cscan);
cvClearMemStorage(memstr);

return edges;

}

int pplfind (cvContourScanner cscan, cvsize frsize) {ofstream arquivo; Char Buff [50]; file.open ("box.txt", ofstream :: app); int ppl = 0; Cvseq* c; Iplimage *out = cvcreateImage (Frsize, 8,3); while (c = cvfindNextContour (cScan)) {CvRect Box = cvBoundingRect (c, 1); if ((box.Height> int (box.width*1.2)) && (box.Height> 20)) {// && (box.width <20)) {// ppl ++; cvRectangle (out, cvPoint (box.x, box.y), cvPoint (box.x+box.width, box.y+box.height), cv_rgb (255,0,50), 1);

        cvShowImage("contours",out);
        //cvWaitKey();
    }
    //printf("Box Height: %d , Box Width: %d ,People: %d\n",box.height,box.width,ppl);
    //cvWaitKey(0);
    int coord = sprintf_s(buff,"%d,%d,%d\n",box.width,box.height,ppl);
    file.write(buff,coord);
}
file.close();
cvReleaseImage(&out);
return ppl;

}

Foi útil?

Solução

Eu nunca usei cvFindNextContour, mas correndo cvFindContours com CV_RETR_EXTERNAL Na sua imagem, parece funcionar bem:

alt text

Eu uso o OpenCV + Python, então esse código pode não ser útil para você, mas por uma questão de completude aqui é:

contours = cv.FindContours(img, cv.CreateMemStorage(0), mode=cv.CV_RETR_EXTERNAL)
while contours:
    (x,y,w,h) = cv.BoundingRect(contours)
    cv.Rectangle(colorImg, (x,y), (x+w,y+h), cv.Scalar(0,255,255,255))
    contours = contours.h_next()

EDIT: Você perguntou como desenhar apenas esses contornos com certas propriedades; Seria algo assim:

contours = cv.FindContours(img, cv.CreateMemStorage(0), mode=cv.CV_RETR_EXTERNAL)
while contours:
    (x,y,w,h) = cv.BoundingRect(contours)
    if h > w*1.2 and h > 20:
        cv.Rectangle(colorImg, (x,y), (x+w,y+h), cv.Scalar(0,255,255,255))
    contours = contours.h_next()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top