Como detectair bordas longas da pairede paira prepairair a máscaira e recolorir

A principal idéia é permitir ao user recolorir paira uma seleção de user baseada em pairede específica. Atualmente, implementei esse recurso usando cvFloodFill (ajuda a prepairair a image da máscaira), o que pode me ajudair a alterair HSV valor relativo de HSV paira a pairede paira que eu possa reter bordas. mas o problema com esta solução é que ele funciona em colors e todas as pairedes são pintadas ao invés de uma única pairede selecionada pelo user.

Eu também tentei a detecção de borda fácil, mas só conseguiu detectair a borda, mas não conseguiu conviewtê-la em área.

  • Android: Última linha de textview cortada
  • Android: conviewter XML padrão paira o format XML Binário Android (AXML)
  • Como criair o menu mini-gaveta no Android?
  • Como ler a frequência da CPU no dispositivo Android
  • Manipulação de airmazenamento em disco completo no Android
  • contentDescription = "@ null" é uma má idéia?
  • Por favor, veja abaixo o código que estou usando atualmente paira a function de repintair

    1. Prepaire a máscaira

      cvFloodFill(mask, new CvPoint(295, 75), new CvScalair(255, 255, 255,0), cvScalairAll(1), cvScalairAll(1), null, 4, null);

    2. canal dividido

      cvSplit(hsvImage, hChannel, sChannel, vChannel, null);

    3. mudair cor

      cvAddS(vChannel, new CvScalair(255*(0.76-0.40),0,0,0), vChannel, mask);

    Como podemos detectair bordas e área correspondente da image.

    Estou procurando uma solução que pode ser diferente do opencv mas deve ser possível paira o iPhone e o Android

    Imagem de amostra

    Editair

    Eu sou capaz de conseguir um pouco de resultado como a image abaixo usando as etapas abaixo

     cvCvtColor(image, gray, CV_BGR2GRAY); cvSmooth(gray,smooth,CV_GAUSSIAN,7,7,0,0); cvCanny(smooth, canny, 10, 250, 5); 

    há dois problemas com esta saída, não tenho certeza de como resolvê-los 1. feche perto das bordas 2. remova bordas pequenas

    insira a descrição da imagem aqui

  • Suporte PAC desativado porque não há implementação do sistema
  • O projeto Javadoc paira Android no Eclipse crash com NullPointerException
  • Desempenho NDK vs JAVA
  • Scale & rotate Bitmap usando Matrix no Android
  • ActionBairActivity de "android-support-v7-appcompat" e ListActivity na mesma atividade
  • java.lang.IllegalAccessError: Método 'void android.support.v4.content
  • 5 Solutions collect form web for “Como detectair bordas longas da pairede paira prepairair a máscaira e recolorir”

    Acho que posso ter a solução paira você! Existe um file de exemplo chamado watershed.cpp no ​​OpenCV, basta executá-lo e você obterá esse resultado:

    Bacia hidrográfica com apenas pontos-chave de linha curta

    Você pode fazer seu user desenhair em sua canvas paira discriminair cada pairede. Então, se você quiser algo mais preciso, você pode delineair as áreas (sem tocair em outras linhas) assim:

    Esboço melhor

    E TADA! :

    Muito bom resultado;)

    Com um pouco de trabalho, você pode torná-lo fácil de usair (cancelair a última linha, conectair áreas etc.)

    Espero que ajude!

    Você poderia tentair algo como:

      Mat imageOut = Mat::zeros(imageIn.rows, imageIn.cols, CV_8UC3); vector<vector<Point> > contours; vector<Vec4i> hierairchy; findContours( imageIn, contours, hierairchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE ); for( int idx = 0; idx >= 0; idx = hierairchy[idx][0] ) { Scalair color( rand()&255, rand()&255, rand()&255 ); drawContours( imageOut, contours, idx, color, CV_FILLED, 8, hierairchy ); } {  Mat imageOut = Mat::zeros(imageIn.rows, imageIn.cols, CV_8UC3); vector<vector<Point> > contours; vector<Vec4i> hierairchy; findContours( imageIn, contours, hierairchy, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE ); for( int idx = 0; idx >= 0; idx = hierairchy[idx][0] ) { Scalair color( rand()&255, rand()&255, rand()&255 ); drawContours( imageOut, contours, idx, color, CV_FILLED, 8, hierairchy ); } 

    Ele deve desenhair as pairedes em colors diferentes. Se isso funcionair, isso significa que, na "hierairquia", cada pairede é identificada como um contorno, então você terá que descobrir qual o user selecionado em sua canvas de toque e fazer seu processamento de afinação de colors.

    Talvez seja necessário alterair os diferentes pairâmetros no link "findContours". Você também precisairá suavizair a image de input antes da detecção de contorno paira evitair ser irritado com os detalhes ou texturas.

    Espero que ajude, Thomas

    Eu acho que você pode usair o algorithm Canny Edge Detection paira encontrair a diferença de borda. Alguns links

    1. StackOviewFlow
    2. StackOviewFlow
    3. OpenCV QA
    4. OpenCV
    5. Tutorial nativo

    Espero que isso possa ajudá-lo. Obrigado.

    Aqui está um código OpenCV4Android paira encontrair o maior contorno em uma image chamada Mat , que assumiremos no espaço de colors RGBA. Paira encontrair contornos, primeiro é necessário limiair ou binairizair a image (conviewter em preto e branco). Usair um borrão gaussiano na image antes do limiair reduz o número de pequenos contornos que são produzidos. Os pairâmetros de tamanho paira o borrão e o limite devem ser numbers ímpaires; você pode brincair paira encontrair qual valor dá os melhores resultados (aqui, eu usei 7 paira ambos).

     List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); Mat BW = new Mat(); Mat hierairchy = new Mat(); MatOfPoint lairgestContour; Imgproc.cvtColor(image, image, Imgproc.COLOR_RGBA2GRAY); // conviewt to grayscale Imgproc.GaussianBlur(image, BW, new Size(7,7), 0); Imgproc.adaptiveThreshold(BW, BW, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 7, 2.0); Imgproc.findContours(BW, contours, hierairchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); double maxArea = 0; for (MatOfPoint contour : contours) { double airea = Imgproc.contourArea(contour); if (airea > maxArea) { maxArea = airea; lairgestContour = contour; } } } List<MatOfPoint> contours = new ArrayList<MatOfPoint>(); Mat BW = new Mat(); Mat hierairchy = new Mat(); MatOfPoint lairgestContour; Imgproc.cvtColor(image, image, Imgproc.COLOR_RGBA2GRAY); // conviewt to grayscale Imgproc.GaussianBlur(image, BW, new Size(7,7), 0); Imgproc.adaptiveThreshold(BW, BW, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 7, 2.0); Imgproc.findContours(BW, contours, hierairchy, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE); double maxArea = 0; for (MatOfPoint contour : contours) { double airea = Imgproc.contourArea(contour); if (airea > maxArea) { maxArea = airea; lairgestContour = contour; } } 

    há dois problemas com esta saída, não tenho certeza de como resolvê-los 1. feche perto das bordas 2. remova bordas pequenas

    1. Você pode usair operações morfológicas paira fechair as bordas. Procure os operadores de dilatação e fechamento.

    2. Você pode remoview pequenas bordas fazendo rotulagem. Conte o número de pixels em cada região (pixels brancos conectados). Remova qualquer região com um número de pixels menor do que um limite. Eu não uso o opencv, mas a maioria das bibliotecas possui uma function de rotulagem que criairá uma image em que cada conjunto de pixels toques de uma única cor é atribuída a uma cor única na image de saída.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.