Shpargalka: tez ma'lumotnoma
Bu bob o'qish uchun emas, qarash uchun. Ishlayotganda esdan chiqqan narsani shu yerdan toping.
O'qish, yozish, ko'rsatish
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
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
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
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
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
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
_, 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
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
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
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
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
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
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
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
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
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
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.