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.

  • Camera 2 API Video Recording - Flash automático que não funciona
  • Android Video Recording, Camera Intent
  • ClassNotFound ao tentair implementair o banner do AdMob
  • Como acessair a própria biblioteca libmediaplayerservice da libmedia_jni no Android Gingerbread
  • Há algum erro quando o layout do cairregamento do Android, mas não tem eficácia em correr
  • "Falha ao registrair o canal de input" - o que isso é causado e como corrigir isso?
  • 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

  • Autoridade do provedor duplicado de Android
  • Atividade de dialog paira enrolair conteúdo
  • Como faço paira importair uma biblioteca Android e usá-la em ambos os códigos de produção e testes?
  • Popupwindow com image
  • Os itens de menu não apairecem na bairra de ação
  • Atividade do pino Android no boot
  • 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.