Pergunta

Dado um objeto em um fundo branco liso, alguém sabe se OpenCV fornece funcionalidade para detectar facilmente um objeto de um quadro capturado?

Eu estou tentando localizar os pontos de canto / centro de um objeto (retângulo). A maneira que eu estou fazendo atualmente, é pela força bruta (digitalizar a imagem para o objeto) e não precisa. Eu estou querendo saber se existe uma funcionalidade sob o capô que eu não estou ciente de.

Editar Detalhes : O tamanho aproximadamente o mesmo que uma pequena lata de refrigerante. A câmara é posicionada por cima do objecto, para dar-lhe uma sensação 2D / retangular. A orientação / ângulo a partir da câmara é aleatório, a qual é calculada a partir dos pontos de canto.

É apenas um fundo branco, com o objeto sobre ele (preto). A qualidade da foto é sobre o que você esperaria ver de uma webcam Logitech.

Uma vez que recebo os pontos de canto, eu calcular o centro. O ponto central é então convertido em centímetros.

É refinando apenas 'como' eu recebo essas 4 cantos é o que eu estou tentando focar. Você pode ver o meu método de força bruta com esta imagem: Imagem

Foi útil?

Solução

Já existe um exemplo de como fazer a detecção retângulo no OpenCV (olhada em amostras / squares.c), e é bastante simples, na verdade.

Aqui está o algoritmo áspero eles usam:

0. rectangles <- {}
1. image <- load image
2. for every channel:
2.1  image_canny <- apply canny edge detector to this channel
2.2  for threshold in bunch_of_increasing_thresholds:
2.2.1   image_thresholds[threshold] <- apply threshold to this channel
2.3  for each contour found in {image_canny} U image_thresholds:
2.3.1   Approximate contour with polygons
2.3.2   if the approximation has four corners and the angles are close to 90 degrees.
2.3.2.1    rectangles <- rectangles U {contour}

Não é uma transliteração exata do que eles estão fazendo, mas deve ajudá-lo.

Outras dicas

Espero que isso ajude, usa o método momento para obter o centróide de uma imagem em preto e branco.

cv::Point getCentroid(cv::Mat img)
{
    cv::Point Coord;
    cv::Moments mm = cv::moments(img,false);
    double moment10 = mm.m10;
    double moment01 = mm.m01;
    double moment00 = mm.m00;
    Coord.x = int(moment10 / moment00);
    Coord.y = int(moment01 / moment00);
    return Coord;
}

OpenCV tem montes de funções que podem ajudá-lo a alcançar este objectivo. Baixar Emgu.CV para um C # .NET embrulhado para a biblioteca se você está programando nesse idioma.

Alguns métodos de conseguir o que quer:

  1. Encontre os cantos como antes - por exemplo, "CornerHarris" função OpenCV

  2. Threshold a imagem e calcular o centro de gravidade - veja http : //www.roborealm.com/help/Center%20of%20Gravity.php ... este é o método que eu usaria. Você pode até mesmo realizar o limiar na rotina COG. isto é cog_x + = * imagePtr <128? 255: 0;

  3. Encontre os momentos de imagem para dar a rotação, o centro de gravidade etc - por exemplo, "Momentos" função OpenCV. (Eu não usei este)

  4. (edit) A biblioteca AForge.NET tem funções de detecção de canto, bem como um projeto de exemplo (MotionDetector) e bibliotecas de conexão com webcams. Eu acho que essa seria a maneira mais fácil de ir, supondo que você está usando o Windows e .NET.

Geralmente é chamado de análise blob em outras bibliotecas de visão de máquina. Eu não usei opencv ainda.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top