Asosiy qismga o'tish

Shpargalka: tez ma'lumotnoma

18-bob 17 kod bloki 2432 so'z

Bu bob o'qish uchun emas, qarash uchun. Ishlayotganda esdan chiqqan narsani shu yerdan toping.

O'qish, yozish, ko'rsatish

python9 qator
img = cv2.imread("fayl.jpg")                    # BGR, None qaytarishi mumkin!
img = cv2.imread("fayl.jpg", cv2.IMREAD_GRAYSCALE)
if img is None:
    raise SystemExit("fayl o'qilmadi")          # HAR DOIM tekshiring
cv2.imwrite("chiqish.png", img)
cv2.imwrite("chiqish.jpg", img, [cv2.IMWRITE_JPEG_QUALITY, 92])

cv2.imshow("oyna", img); cv2.waitKey(0); cv2.destroyAllWindows()   # oynali muhitda
plt.imshow(img[:, :, ::-1])                     # Jupyter da: BGR -> RGB

Rasm haqida ma'lumot

python4 qator
h, w = img.shape[:2]                            # balandlik BIRINCHI
kanallar = img.shape[2] if img.ndim == 3 else 1
img.dtype                                       # uint8 (0-255)
img.size                                        # jami elementlar soni

Kesish, nusxa, birlashtirish

python6 qator
bolak = img[y1:y2, x1:x2]                       # KO'RINISH (view), nusxa emas!
bolak = img[y1:y2, x1:x2].copy()                # haqiqiy nusxa
b, g, r = cv2.split(img)
img = cv2.merge([b, g, r])
yonma_yon = np.hstack([a, b])
ustma_ust = np.vstack([a, b])

O'lcham va geometriya

python10 qator
kichik = cv2.resize(img, (640, 360))                      # (kenglik, balandlik)
kichik = cv2.resize(img, None, fx=0.5, fy=0.5, interpolation=cv2.INTER_AREA)
# kichraytirish -> INTER_AREA | kattalashtirish -> INTER_CUBIC yoki INTER_LINEAR

M = cv2.getRotationMatrix2D((w / 2, h / 2), 30, 1.0)      # markaz, burchak, masshtab
burilgan = cv2.warpAffine(img, M, (w, h))
akslangan = cv2.flip(img, 1)                              # 1 gorizontal, 0 vertikal, -1 ikkalasi

P = cv2.getPerspectiveTransform(manba4, nishon4)          # np.float32, 4x2
togri = cv2.warpPerspective(img, P, (w, h))

Rang fazolari

python7 qator
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
hsv  = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)               # H: 0-179, S: 0-255, V: 0-255
lab  = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
rgb  = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

maska = cv2.inRange(hsv, (18, 90, 90), (35, 255, 255))    # sariq
# QIZIL uchun IKKI oraliq: (0,90,70)-(8,255,255) va (170,90,70)-(179,255,255)
Rang H oralig'i (OpenCV)
Qizil 0–8 va 170–179
Sariq 18–35
Yashil 35–85
Ko'k 95–130
Siyohrang 130–160

Filtrlash

python4 qator
cv2.blur(img, (5, 5))                           # eng tez, eng qo'pol
cv2.GaussianBlur(img, (5, 5), 0)                # umumiy shovqin — standart tanlov
cv2.medianBlur(img, 5)                          # TUZ-QALAMPIR uchun eng yaxshi
cv2.bilateralFilter(img, 9, 75, 75)             # chekkani saqlaydi, SEKIN

Yadro toq bo'lishi shart: 3, 5, 7, 9...

Threshold

python4 qator
_, b = cv2.threshold(gray, 140, 255, cv2.THRESH_BINARY)
ch, b = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)   # chegarani o'zi topadi
b = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C,
                          cv2.THRESH_BINARY, 31, 10)     # blockSize TOQ

Notekis yorug'lik → adaptive. Bir tekis fon → Otsu. Kontur qidirishdan oldin obyekt oq bo'lishi kerak → THRESH_BINARY_INV.

Morfologiya

python7 qator
yadro = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (5, 5))
cv2.erode(b, yadro)                             # oq kichrayadi
cv2.dilate(b, yadro)                            # oq kattalashadi
cv2.morphologyEx(b, cv2.MORPH_OPEN, yadro)      # yakka nuqtalarni o'chiradi
cv2.morphologyEx(b, cv2.MORPH_CLOSE, yadro)     # teshiklarni to'ldiradi
cv2.morphologyEx(b, cv2.MORPH_GRADIENT, yadro)  # kontur chizig'i
cv2.morphologyEx(gray, cv2.MORPH_BLACKHAT, k31) # notekis fondagi qorong'i matn

Matn qatorlarini birlashtirish: cv2.MORPH_RECT, (40, 3) kabi keng va past yadro.

Chekka

python7 qator
sx = cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize=3)  # CV_8U EMAS — manfiy qiymatlar yo'qoladi
lap = cv2.Laplacian(gray, cv2.CV_64F)
keskinlik = lap.var()                            # xira rasmni aniqlash

chekka = cv2.Canny(gray, 50, 150)                # yuqori ≈ 2-3 × past
med = np.median(gray)                            # avtomatik chegaralar
chekka = cv2.Canny(gray, int(0.67 * med), int(1.33 * med))

Canny dan oldin silliqlang.

Konturlar

python12 qator
kont, ier = cv2.findContours(b, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
cv2.drawContours(img, kont, -1, (0, 255, 0), 2)

cv2.contourArea(c)
cv2.arcLength(c, True)
M = cv2.moments(c); cx, cy = M["m10"] / M["m00"], M["m01"] / M["m00"]
yaqin = cv2.approxPolyDP(c, 0.02 * cv2.arcLength(c, True), True)   # burchaklar soni
x, y, w, h = cv2.boundingRect(c)
quti = cv2.boxPoints(cv2.minAreaRect(c))         # burilgan to'rtburchak
(mx, my), r = cv2.minEnclosingCircle(c)
qobiq = cv2.convexHull(c)
(mx, my), (a, b_), burchak = cv2.fitEllipse(c)   # kamida 5 nuqta kerak
Rejim Qaytaradi
RETR_EXTERNAL Faqat tashqi konturlar (odatiy tanlov)
RETR_LIST Hammasi, ierarxiyasiz
RETR_TREE To'liq daraxt (teshiklar bilan)

Foydali nisbatlar: extent = maydon / (w*h), solidity = maydon / qobiq_maydoni, yumaloqlik = 4πA / P².

Gistogramma va kontrast

python9 qator
gist = cv2.calcHist([gray], [0], None, [256], [0, 256])   # hammasi ro'yxat ichida
teng = cv2.equalizeHist(gray)                              # global
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
c = clahe.apply(gray)                                      # mahalliy — odatda yaxshiroq

# RANGLI rasmda: BGR kanallariga ALOHIDA qilmang!
lab = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
L, A, B = cv2.split(lab)
natija = cv2.cvtColor(cv2.merge([clahe.apply(L), A, B]), cv2.COLOR_LAB2BGR)

Shablon qidirish

python3 qator
r = cv2.matchTemplate(gray, shablon, cv2.TM_CCOEFF_NORMED)
mn, mx, mn_joy, mx_joy = cv2.minMaxLoc(r)
joy = mn_joy if usul in (cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED) else mx_joy

Har doim _NORMED. O'lcham va burilishga chidamaydi. Ko'p moslik: chegara + cv2.dnn.NMSBoxes(qutilar, ballar, chegara, 0.3).

Kalit nuqtalar

python11 qator
orb = cv2.ORB_create(nfeatures=1000)
n, d = orb.detectAndCompute(gray, None)

bf = cv2.BFMatcher(cv2.NORM_HAMMING)             # SIFT uchun cv2.NORM_L2
juftlar = bf.knnMatch(d1, d2, k=2)
yaxshi = [a for a, b in juftlar if a.distance < 0.75 * b.distance]   # Lowe ratio

src = np.float32([n1[m.queryIdx].pt for m in yaxshi]).reshape(-1, 1, 2)
dst = np.float32([n2[m.trainIdx].pt for m in yaxshi]).reshape(-1, 1, 2)
H, maska = cv2.findHomography(src, dst, cv2.RANSAC, 5.0)
ichkilar = int(maska.sum())                      # 10 dan kam bo'lsa ishonmang
Detektor Deskriptor Norma Tezlik
ORB 32 bayt ikkilik NORM_HAMMING Eng tez
AKAZE 61 bayt ikkilik NORM_HAMMING O'rtacha
SIFT 128 float NORM_L2 Sekin, aniq

Video

python15 qator
cap = cv2.VideoCapture("video.mp4")              # yoki 0 — kamera
print(cap.get(cv2.CAP_PROP_FPS), cap.get(cv2.CAP_PROP_FRAME_COUNT))
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)           # kamera uchun — dekodlashni tejaydi
while True:
    ok, kadr = cap.read()
    if not ok:                                   # HAR DOIM tekshiring
        break
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break
cap.release()

yoz = cv2.VideoWriter("chiq.mp4", cv2.VideoWriter_fourcc(*"mp4v"), 30.0, (640, 360))
assert yoz.isOpened()                            # jim ravishda ishlamay qo'yadi!
yoz.write(kadr)                                  # o'lcham VA 3 kanal aniq mos kelsin
yoz.release()

Kadr byudjeti: 1000 / FPS ms. 30 FPS → 33 ms.

Harakat va kuzatish

python9 qator
fon = cv2.createBackgroundSubtractorMOG2(history=200, varThreshold=25, detectShadows=False)
maska = fon.apply(kadr)                          # soya = 127, kerak bo'lmasa detectShadows=False

oqim = cv2.calcOpticalFlowFarneback(g1, g2, None, 0.5, 3, 15, 3, 5, 1.2, 0)
kuch, burchak = cv2.cartToPolar(oqim[..., 0], oqim[..., 1])

tr = cv2.TrackerMIL_create()                     # CSRT/KCF: opencv-contrib-python kerak
tr.init(kadr, (x, y, w, h))
ok, quti = tr.update(kadr)

Fon ayirish qotgan kamera talab qiladi.

Yuz

python6 qator
haar = cv2.CascadeClassifier(cv2.data.haarcascades + "haarcascade_frontalface_default.xml")
yuzlar = haar.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(20, 20))

yunet = cv2.FaceDetectorYN.create("yunet.onnx", "", (320, 320), 0.7, 0.3, 5000)
yunet.setInputSize((w, h))                       # HAR rasm o'lchami uchun qayta chaqiring
_, F = yunet.detect(img)                         # har qator: quti(4) + 5 nuqta(10) + ishonch(1)

Chizish

python5 qator
cv2.line(img, (x1, y1), (x2, y2), (0, 255, 0), 2)
cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)     # -1 = to'ldirish
cv2.circle(img, (cx, cy), r, (0, 0, 255), -1)
cv2.putText(img, "matn", (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1.0, (0, 0, 0), 2, cv2.LINE_AA)
cv2.polylines(img, [nuqtalar], True, (255, 0, 0), 2)

Rang — BGR, cv2.LINE_AA silliq chekka beradi.

Eng ko'p uchraydigan xatolar

Xato Belgisi Yechim
imread natijasi tekshirilmagan NoneType xatosi keyinroq if img is None: ...
BGR/RGB chalkashligi Ranglar almashgan img[:, :, ::-1] yoki cvtColor
shape tartibi Rasm cho'zilgan h, w = img.shape[:2], resize ga (w, h)
uint8 to'lib ketishi Qora dog'lar cv2.add yoki np.int16 ga o'tish
Kesilgan bo'lak — view Asl rasm o'zgarib ketdi .copy()
Juft blockSize/yadro Xato yoki g'alati natija Toq son ishlating
Sobel da CV_8U Chekkaning yarmi yo'q CV_64F da hisoblang
SQDIFF da max_loc Butunlay boshqa joy SQDIFF da min_loc
setInputSize unutilgan YuNet noto'g'ri koordinata Har rasm uchun chaqiring
VideoWriter tekshirilmagan 0 baytli fayl isOpened() + o'lcham mosligi
release() yo'q Fayl band, kamera ochilmaydi try/finally
Chegara taxmin qilingan Hech narsa topilmaydi Ballar taqsimotini o'lchang

Qaysi asbobni qachon

Vazifa Birinchi tanlov
Rang bo'yicha topish HSV + inRange + morfologiya
Shakl bo'yicha topish threshold → kontur → approxPolyDP
Aynan o'sha rasm bo'lagini topish matchTemplate (o'lcham/burchak o'zgarmasa)
Burilgan/o'lchami o'zgargan obyekt ORB + findHomography
Qotgan kamerada harakat createBackgroundSubtractorMOG2
Bitta obyektni ta'qib qilish CSRT (contrib) yoki MIL
Hujjatni to'g'rilash Canny → kontur → getPerspectiveTransform
Notekis yorug'likda matn adaptiveThreshold (GAUSSIAN)
Xira rasmni aniqlash cv2.Laplacian(gray, cv2.CV_64F).var()
Umumiy obyekt aniqlash OpenCV emas — YOLO (alohida kitob)

Ishlash tezligi (bu kitobdagi o'lchovlar)

2560x1440 kadr, 8 oqimli protsessor:

Amal 2560x1440 640x360
resize 0.08 ms 0.01 ms
cvtColor 0.12 ms 0.01 ms
GaussianBlur 5x5 0.6 ms 0.05 ms
Canny 3.4 ms 0.36 ms
ORB (1000 nuqta) 25.7 ms 3.3 ms
bilateralFilter 30.7 ms 12.7 ms
Video dekodlash 2.5 ms —

Birinchi optimallashtirish har doim bitta: resize.

Kitobdagi o'lchovlar xulosasi

Bob O'lchangan natija
6 Adaptive threshold F1 94.1%, Otsu 91.2%, global 85.3%
7 Tuz-qalampirda median PSNR 33.1 dB, boshqalari ~26 dB
8 Filtrsiz Canny 16.72% soxta chekka, mediandan keyin 0.89% (haqiqat 0.85%)
9 opening + closing IoU 98%; 120 px yadro matnni roppa-rosa 8 qatorga birlashtirdi
10 Kontur maydoni xatosi < 2%; shovqinda 4235 konturdan 6 taga
11 equalizeHist entropiyani oshirmadi (5.92 → 5.86), CLAHE oshirdi (7.09)
12 20° burilishda matchTemplate balli 0.68 ga tushdi
13 O'sha 20° da ORB 374 ichki juft topdi; homografiya xatosi 0.5–1 px
14 Kichik rasm parallellashmaydi: 640x360 da 55 ns/piksel, kattalarida 8 ns
15 Qotgan kamerada fon ayirish 1.95 px, tracker 14.36 px
16 YuNet 71.6% / 1.3 ms, Haar 42.2% / 10.9 ms
17 Skaner F1 81.1%; aniq burchaklar bilan 95.2%

Bu jadval bitta fikrni takrorlaydi va u kitobning asosiy g'oyasi: har bir tanlovni o'lchang. "Chiroyliroq ko'rinadi" — bu dalil emas.

Bu bobni bepul o'qidingiz.

Kitob o'rgatadi, lekin sizning kodingiz nega ishlamaganini ayta olmaydi. Kursda uy vazifangiz tekshiriladi.

Telegramda yozish Narxlar