C# emgucv/opencv Найти квадратную реализациюC#

Место общения программистов C#
Ответить
Anonymous
 C# emgucv/opencv Найти квадратную реализацию

Сообщение Anonymous »

У меня уже есть код, но я думаю, что в моем коде все еще есть улучшение. Фон серый. < /P>
Что я хочу найти < /p>
Это моя реализация: < /p>
frame_drone< /code> -это кадр изображения. < /p>
Моя реализация: < /p>

pyrdown, pyrup < /li>
Smoothgaussian (3) < /li>
Convert < /li>
threshold hsv -> < /li>
Hsv.inrange (h, s, v) < /li>
пороговое значение HSV Dilate 3 < /li>
Threshold hsv erode 1 < /li>
Порог HSV.Canny (50,150) < /li>
>canny.smoothgaussis(/> < /li>
findhybusian.> < /Li>
> Контуры хэпни < /li>
if currentContour.area> 2500 < /li>
Если CurrentContour.total = 4 // square < /li>
Найдите угол края. Квадрант. public void quadrado()
{
#region Encontrar Quadrados

// int erosao = 4;
// int dilatacao = 1;
incrementa_listagem_quadrados = 0;
tamanho_imagem.X = frame_drone.Width;
tamanho_imagem.Y = frame_drone.Height;

// elemento_erosao = new StructuringElementEx(erosao, erosao, 1, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT); //elemento kernelx,kernely,anchorx,anchory
//elemento_dilatacao = new StructuringElementEx(dilatacao, dilatacao, 1, 1, Emgu.CV.CvEnum.CV_ELEMENT_SHAPE.CV_SHAPE_RECT); //elemento kernelx,kernely,anchorx,anchory

frame_drone = frame_drone.PyrDown().PyrUp();
frame_drone = frame_drone.SmoothGaussian(3); //Filtro mediana antes da passagem para HSV
frame_drone_hsv = frame_drone.Convert(); //Converte a imagem da camera RGB para HSV
// CvInvoke.cvCvtColor(frame_drone_hsv, frame_drone_hsv, COLOR_CONVERSION.BGR2HSV);
//frame_drone_hsv = frame_drone.Convert();
frame_drone_threshold_hsv = frame_drone_hsv.InRange(new Hsv(hl.Value, sl.Value, vl.Value), new Hsv(hh.Value, sh.Value, vh.Value)); //utiliza as trackbars HSV para ver a cor pretendida
//frame_drone_hsv.Split();

//frame_drone_gray = frame_drone.Convert().PyrDown().PyrUp(); //Bgr para Gray
//frame_drone_threshold_gray = frame_drone_gray.ThresholdBinary(new Gray(150), new Gray(255)); //Threshold para mostrar apenas partes escuras (quadrados)
//frame_drone_threshold_gray = frame_drone_threshold_gray.Dilate(2);
//Dilatacao seguida de erosao para fechar o ruido (Origina o Fecho de Buracos nas Regiões e a Eliminação de Baías nos limites da regiões)
//CvInvoke.cvDilate(frame_drone_threshold_hsv, frame_drone_threshold_hsv, elemento_dilatacao, 1);
//CvInvoke.cvErode(frame_drone_threshold_hsv, frame_drone_threshold_hsv, elemento_erosao, 1);

frame_drone_threshold_hsv = frame_drone_threshold_hsv.Dilate(3);
frame_drone_threshold_hsv = frame_drone_threshold_hsv.Erode(1);

//Erosao seguida de dilatacao (Retira pequenas porções ou regiões que saem dos limites)
//CvInvoke.cvErode(frame_drone_processado, frame_drone_processado, elemento_erosao, 1);
// CvInvoke.cvDilate(frame_drone_processado, frame_drone_processado, elemento_dilatacao, 1);

frame_drone_gray = frame_drone.Convert();
//frame_drone_gray = frame_drone_gray.SmoothGaussian(9); //Filtro gaussiano na imagem binaria

frame_drone_canny = frame_drone_threshold_hsv.Canny(50,150); //Canny
frame_drone_canny = frame_drone_canny.SmoothGaussian(5);
// CvInvoke.cvDilate(frame_drone_canny, frame_drone_canny, elemento_dilatacao, 1); //Dilatação ao canny
//frame_drone_threshold_hsv_circulo = frame_drone_gray.ThresholdBinaryInv(new Gray(trackBar1.Value), new Gray(255));
frame_drone_threshold_hsv_circulo = frame_drone_hsv.InRange(new Hsv(0, 80, 40), new Hsv(22, 248, 251)); //laranja
//frame_drone_threshold_hsv_circulo = frame_drone_hsv.InRange(new Hsv(0, 0, 0), new Hsv(0, 0, 0));
frame_drone_threshold_hsv_circulo = frame_drone_threshold_hsv_circulo.Dilate(6);
frame_drone_threshold_hsv_circulo = frame_drone_threshold_hsv_circulo.Erode(6);
frame_drone_threshold_hsv_circulo = frame_drone_threshold_hsv_circulo.SmoothGaussian(15);

frame_drone_copia = frame_drone.Copy(); //copia a imagem original para evitar pixeis escritos na imagem

#region Extração de contornos
using (MemStorage storage = new MemStorage()) //aloca espaço na memoria
{
//detecao_circulo_em_quadrado(); //procura por circulos no quadrado

//Procura contornos
for (Contour 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 currentContour = contours.ApproxPoly(contours.Perimeter * 0.05, storage); //AproxContour
// MCvMoments moments; //inicializacao
// moments = currentContour.GetMoments(); // momentos

//Cria letra
MCvFont f = new MCvFont(FONT.CV_FONT_HERSHEY_COMPLEX, 0.8, 0.8);

// centroid = new System.Drawing.Point((int)(moments.m10 / moments.m00), (int)(moments.m01 / moments.m00)); //calculo do centroid

if (currentContour.Area > 2500/*currentContour.Area >= area_contornos_min.Value && currentContour.Area 105) //Limitação do angulo para determinar se é quadrado ou nao
{
retangular = false; //não é quadrado
quadrado_detetado = 0;
lv_lista_quadrados.Items.Clear();
//incrementa_listagem_quadrados = 0;
posicao_atual = new PointF(0, 0);
}

if (retangular)
{
incrementa_listagem_quadrados++;
centroid.X = (int)currentContour.GetMoments().GravityCenter.x;
centroid.Y = (int)currentContour.GetMoments().GravityCenter.y;

List
pontos_quadrado = new List()
{
pontos[0],
pontos[1],
pontos[2],
pontos[3]
};

pontos_quadrado = pontos_quadrado.OrderBy(x => Math.Pow(x.X, 2) + Math.Pow(x.Y, 2)).ToList(); //reorganiza a lista de pontos por distancia a um canto da imagem

if (centroid.X > tamanho_imagem.X || centroid.X < 0 || centroid.Y > tamanho_imagem.Y || centroid.Y < 0)
{
centroid.X = 0;
centroid.Y = 0;
}

for (int vertices = 0; vertices 300 && huecirculo < 350)
//{
// frame_drone.Draw("Circulo", ref f, new System.Drawing.Point((int)ponto_medio_circulo.X, (int)ponto_medio_circulo.Y), new Bgr(Color.White)); //Escrever na imagem a cor no ponto medio
//}

if (hue > 160 && hue < 250)
{
frame_drone.Draw("Azul", ref f, new System.Drawing.Point(ponto_medio_x, ponto_medio_y), new Bgr(Color.White)); //Escrever na imagem a cor no ponto medio
cores_dos_pontos_medios[incrementa_ponto_medio] = "Azul";
}
else if (hue > 60 && hue = 0 && hue = 0 && hue 330 && hue
Это результат: < /p>
Результат < /p>
Мой вывод: порог и квадратный вывод не являются идеальными. Это работает, если освещение идеально. Если это не самая лучшая, но все же хорошо, он не может хорошо порожать только квадрат. Есть ли другой вид реализации?


Подробнее здесь: https://stackoverflow.com/questions/406 ... ementation
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»