Pertanyaan Opencv fungsi polyline dalam python melempar pengecualian


Saya mencoba menggambar segiempat yang acak di atas gambar menggunakan fungsi polyline dalam OpenCV. Ketika saya melakukannya saya mendapatkan kesalahan berikut

OpenCV Error: Assertion gagal (p.checkVector (2, CV_32S)> = 0) di   polyline, file   /tmp/buildd/ros-fuerte-opencv2-2.4.2-1precise-20130312-1306/modules/core/src/d   rawing.cpp, baris 2065

Saya menyebut fungsi itu seperti itu,

cv2.polylines(img, points, 1, (255,255,255))

Di mana poin adalah sebagai numpy array seperti yang ditunjukkan di bawah ini (Ukuran gambar adalah 1280x960):

[[910 641]
 [206 632]
 [696 488]
 [458 485]]

dan img hanya gambar normal yang saya bisa imshow. Saat ini saya hanya menggambar garis di antara titik-titik ini sendiri, tetapi saya mencari solusi yang lebih elegan.

Bagaimana saya harus memperbaiki kesalahan ini?


22
2018-06-21 18:17


asal


Jawaban:


Masalahnya dalam kasus saya adalah itu numpy.array dibuat int64-bilangan bit secara default. Jadi saya harus secara eksplisit mengubahnya menjadi int32:

points = np.array([[910, 641], [206, 632], [696, 488], [458, 485]])
# points.dtype => 'int64'
cv2.polylines(img, np.int32([points]), 1, (255,255,255))

(Sepertinya bug di cv2 python mengikat, seharusnya sudah diverifikasi dtype)


30
2017-09-15 20:26



Fungsi ini tidak cukup didokumentasikan dengan baik dan kesalahannya juga tidak terlalu berguna. Bagaimanapun, cv2.polylines mengharapkan daftar poin, cukup ubah baris Anda menjadi ini:

import cv2
import numpy as np

img = np.zeros((768, 1024, 3), dtype='uint8')

points = np.array([[910, 641], [206, 632], [696, 488], [458, 485]])
cv2.polylines(img, [points], 1, (255,255,255))

winname = 'example'
cv2.namedWindow(winname)
cv2.imshow(winname, img)
cv2.waitKey()
cv2.destroyWindow(winname)

Contoh di atas akan mencetak gambar berikut (rescaled):

enter image description here


23
2018-06-21 18:31



kesalahan mengatakan array Anda harus dari dimensi 2. Jadi membentuk kembali array sebagai berikut:

points = points.reshape(-1,1,2)

Maka itu berfungsi dengan baik.

Juga, jawaban yang diberikan oleh jabaldonedo juga berfungsi dengan baik untuk saya.


4
2018-06-22 07:19



pts = np.array([[40,300],[54,378],[60,420],[30,333]],np.int32) 
pts = pts.reshape((-1,1,2))
img = cv2.polylines(img,pts,True,(125,215,145),1)

Dokumentasi resmi untuk memberikan penjelasan, perlu dibentuk ulang


0
2018-01-11 03:05