0
votes

Python OpenCV identifie les rangées de cultures

Je suis nouveau à OpenCV. En référence à divers forums et articles, j'ai pu proposer le script suivant. Attaché la sortie du script.

J'essaie d'identifier toutes les lignes principales pour séparer le ciel, la culture et la tranchée. Mais avec le code, j'ai pu identifier seulement 1 ligne. xxx

Sortie Capture d'écran


3 commentaires

S'il vous plaît laissez-moi savoir si je regarde le problème.


Pourquoi Houghline? La segmentation semble mieux pour ce problème


Bonjour @yunustemurlenk, c'est ce que j'ai pu comprendre dans 7 heures de la façon d'installer OpenCV. Donc, je pourrais très bien être sur la mauvaise piste. Sur un forum, ils avaient utilisé Houghline pour identifier la route, ce qui est assez proche de ce que j'essaie de faire, donc j'ai utilisé la même chose. Va vérifier la segmentation. robindavid.fr/opencv--Tutorial/... < / a>


3 Réponses :


0
votes

5 commentaires

Bonjour Hariprasad, un peu similaire, mais au niveau d'une rangée unique. J'essaie de construire un bot qui parcourra chaque rangée et mesurera le niveau d'humidité à des intervalles particuliers.


Stackoverflow.com/users/9267284/hariprasad Pouvez-vous savoir comment vous avez atteint ce qui précède? Merci


Ici, j'ai utilisé la détection rapide de la ligne et j'ai également fait quelques opérations morphologiques telles que la fermeture et la dilatation, pouvez-vous poster votre image d'entrée, je vérifierai une fois et postera le code ...


Bonjour Hariprasad, son présent dans la capture d'écran de la question. Voulez-vous dire l'image originale?


Je n'arrive pas à trouver comment télécharger une image ici. Mais il était quelque chose que je téléchargé à partir d'Internet crypté-tbn0.gstatic. com / ... merci



1
votes
**This is what I tried, here you can filter the lines**

    #!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Created on Mon Jun  8 16:17:31 2020

@author: hariprasad
"""

import cv2 as cv
import sys
from matplotlib import pyplot as plt
import numpy as np
import math



image = cv.imread(cv.samples.findFile("crop.jpeg"))
image = cv.resize(image,(500,500))
if image is None:
    sys.exit("Could not read the image.")

hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)

mask = cv.inRange(hsv, (36, 25, 25), (70, 255, 255))
#mask = cv.inRange(hsv, (15, 255, 150), (92, 255, 150))

imask = mask>0
green = np.zeros_like(image, np.uint8)
green[imask] = image[imask]
cv.imshow("green", green)

gray = cv.cvtColor(green, cv.COLOR_BGR2GRAY)
#cv.imshow("gray", gray)

blur = cv.GaussianBlur(gray, (11, 11), 0)


_,thresh = cv.threshold(gray,127,255,cv.THRESH_BINARY)
#cv.imshow("thresh",thresh)
kernel = np.ones((5,5),np.uint8)
closing = cv.morphologyEx(thresh, cv.MORPH_CLOSE, kernel)
dilation = cv.dilate(closing,kernel,iterations = 3)
#cv.imshow("dilate",dilation)
blur = cv.GaussianBlur(dilation, (11, 11), 0)
#cv.imshow("blur", blur)
canny_image = cv.Canny(blur, 50, 200, None, 3)
#cv.imshow("canny_image", canny_image)










def dist(x, y, x1, y1):
    return ((x-x1)**2+(y-y1)**2)**(0.5)


def slope(x, y, x1, y1):
    if y1 != y:
        return ((x1-x)/(y1-y))
    else:
        return 0

fld = cv.ximgproc.createFastLineDetector()
lines = fld.detect(canny_image)
result_img = fld.drawSegments(canny_image, lines)
for line in lines:
    x0 = int(round(line[0][0]))
    y0 = int(round(line[0][1]))
    x1 = int(round(line[0][2]))
    y1 = int(round(line[0][3]))
    cv.line(canny_image, (x0, y0), (x1, y1), 255, 1, cv.LINE_AA)
    #dlist = []
    d = dist(x0, y0, x1, y1)
    #dlist.append(d)

    if d :
        #cv.line(image, (x0, y0), (x1, y1), (0, 255, 0), 2, cv.LINE_AA)

        m = (slope(x0, y0, x1, y1))
        print(m)

        if m>=2 :#and m!=0:# and m < 2:
            cv.line(image, (x0, y0), (x1, y1), (255, 0, 255), 2, cv.LINE_AA)
        elif m> -3 and m<0.5: 
            cv.line(image, (x0, y0), (x1, y1), (255, 255, 0), 1, cv.LINE_AA)


cv.imshow("Source", result_img)
cv.imshow("Source1", image)
cv.imwrite("op.jpeg",image)
#cv.imshow("Detected Lines (in red) - Standard Hough Line Transform", cast)
#cv.imshow("Detected Lines (in red) - Probabilistic Line Transform", cdstP)

cv.waitKey(0)
cv.destroyAllWindows()

1 commentaires

Merci Hariprasad. Ce sont des très bons pointeurs qui m'aideraient à apprendre à l'avenir.



1
votes

J'ai pu le faire fonctionner avec le paramètre MAXLINEGAP de la fonction MAXLINEGAP de Fonction d'OpenCV

#!./.venv/bin/python3

import cv2 as cv
import sys
from matplotlib import pyplot as plt
import numpy as np

image = cv.imread(cv.samples.findFile("images/1.jpeg"))
if image is None:
    sys.exit("Could not read the image.")

hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV)

mask = cv.inRange(hsv, (36, 25, 25), (70, 255, 255))
#mask = cv.inRange(hsv, (15, 255, 150), (92, 255, 150))

imask = mask>0
green = np.zeros_like(image, np.uint8)
green[imask] = image[imask]
cv.imshow("green", green)

gray = cv.cvtColor(green, cv.COLOR_BGR2GRAY)
cv.imshow("gray", gray)

blur = cv.GaussianBlur(gray, (11, 11), 0)
cv.imshow("blur", blur)

canny_image = cv.Canny(blur, 50, 200, None, 3)
cv.imshow("canny_image", canny_image)

lines = cv.HoughLinesP(canny_image, 1, np.pi/100, 30, maxLineGap=18)
for line in lines:
    x1, y1, x2, y2 = line[0]
    cv.line(image, (x1, y1), (x2, y2), (0, 0, 255), 3)

cv.imshow("final", image)

cv.waitKey()
cv.destroyAllWindows()


0 commentaires