C# Find the closest centroid -
i have code it's not because add centroid the list(todos_centroides) , after find squares calculate 1 closest. it's causing delay on image processing.
does have better idea?
public void quadrado() { frame_drone_copia = frame_drone.copy(); //copia imagem original para evitar pixeis escritos na imagem tamanho_imagem.x = frame_drone.width; tamanho_imagem.y = frame_drone.height; //frame_drone = frame_drone.smoothbilatral(9,0,) frame_drone = frame_drone.smoothblur(11,11); frame_drone = frame_drone.pyrdown().pyrup(); cvinvoke.cvcvtcolor(frame_drone, frame_drone_gray, color_conversion.bgr2gray); //cvinvoke.cvcvtcolor(frame_drone, frame_drone_hsv, color_conversion.bgr2hsv); //converte imagem da camera rgb para hsv frame_drone_hsv = frame_drone.convert< hsv, byte >(); //frame_drone_threshold_hsv = frame_drone_hsv.inrange(new hsv(0,110,0), new hsv(255,255,255)); //utiliza trackbars hsv para ver cor pretendida frame_drone_threshold_hsv = frame_drone_hsv.inrange(new hsv(arena.valor_hl.value, arena.valor_sl.value, arena.valor_vl.value), new hsv(arena.valor_hh.value, arena.valor_sh.value, arena.valor_vh.value)); //utiliza trackbars hsv para ver cor pretendida //frame_drone_amarelo= frame_drone_hsv.inrange(new hsv(arena.valor_hl.value, arena.valor_sl.value, arena.valor_vl.value), new hsv(arena.valor_hh.value, arena.valor_sh.value, arena.valor_vh.value)); //utiliza trackbars hsv para ver cor pretendida frame_drone_amarelo = frame_drone_hsv.inrange(new hsv(6, 28, 75), new hsv(66, 160, 255)); cvinvoke.cvor(frame_drone_threshold_hsv, frame_drone_amarelo, frame_drone_threshold_hsv, new intptr()); frame_drone_threshold_hsv = frame_drone_threshold_hsv.dilate(4); frame_drone_threshold_hsv = frame_drone_threshold_hsv.erode(1); frame_drone_canny = frame_drone_threshold_hsv.canny(160, 80); frame_drone_canny = frame_drone_canny.smoothgaussian(9); using (memstorage storage = new memstorage()) //aloca espaço na memoria { //procura contornos (contour<system.drawing.point> contours = frame_drone_canny.findcontours(emgu.cv.cvenum.chain_approx_method.cv_chain_approx_simple, emgu.cv.cvenum.retr_type.cv_retr_tree, storage); contours != null; contours = contours.hnext) { contour<system.drawing.point> currentcontour = contours.approxpoly(contours.perimeter * 0.05, storage); //aproxcontour if (currentcontour.area > 3300/*currentcontour.area >= area_contornos_min.value && currentcontour.area <= area_contornos_max.value*/) //se area estiver dentro dos valores das trackbars { if (currentcontour.total == 4) //se retangulo/quadrado { retangular = true; pontos = currentcontour.toarray(); //pontos para array linesegment2d[] edges = pointcollection.polyline(pontos, true); (int = 0; < edges.length; i++) { double angulo = math.abs(edges[(i + 1) % edges.length].getexteriorangledegree(edges[i])); if (angulo < 75 || angulo > 105) //limitação angulo para determinar se é quadrado ou nao { retangular = false; //não é quadrado centroid = new point(0, 0); posicao_atual = new pointf(0, 0); } } if (retangular) { frame_drone_copia.draw(currentcontour, new bgr(color.orange), 6); //desenha o contorno quadrado frame_drone_copia.draw(new circlef(new system.drawing.pointf(centroid.x, centroid.y), 1), new bgr(color.red), 5); centroid.x = (int)currentcontour.getmoments().gravitycenter.x; centroid.y = (int)currentcontour.getmoments().gravitycenter.y; todos_centroides.add(new pointf(centroid.x, centroid.y)); (int j = 0; j < pontos.length; j++) { if (centroid.x - pontos[j].x > 0 && centroid.y - pontos[j].y > 0) { pontos_quadrado[0] = new point(pontos[j].x, pontos[j].y); } else if (centroid.x - pontos[j].x > 0 && centroid.y - pontos[j].y < 0) { pontos_quadrado[1] = new point(pontos[j].x, pontos[j].y); } else if (centroid.x - pontos[j].x < 0 && centroid.y - pontos[j].y > 0) { pontos_quadrado[2] = new point(pontos[j].x, pontos[j].y); } else if (centroid.x - pontos[j].x < 0 && centroid.y - pontos[j].y < 0) { pontos_quadrado[3] = new point(pontos[j].x, pontos[j].y); } } } } } } } //verificar qual o centroid mais proximo centro da imagem. mais_proximo = todos_centroides.orderby(x => math.pow(x.x - tamanho_imagem.x / 2, 2) + math.pow(x.y - tamanho_imagem.y / 2, 2)).firstordefault(); //verifica qual o ponto mais proximo centro da imagem todos_centroides.clear(); if (mais_proximo != new pointf(0, 0)) { calculo_cor(mais_proximo); } }
Comments
Post a Comment