您嘗試調整的示例是針對OpenCV 2.0的新python界面。這可能是前綴和非前綴函數名稱(cv.cvSetData()
與cv.SetData()
)之間混淆的根源。
的OpenCV 2.0現在一般用兩組蟒綁定:
錯誤消息背後的原因是SWIG包裝per不處理從python字符串到普通的舊C緩衝區的轉換。但是,SWIG包裝附帶opencv.adaptors
模塊,該模塊旨在支持從numpy
和PIL
圖像到OpenCV的轉換。
以下(測試)的代碼應該解決您原來的問題(轉化率從PIL到OpenCV的),使用SWIG接口:
# PIL to OpenCV using the SWIG wrapper
from opencv import cv, adaptors, highgui
import PIL
pil_img = PIL.Image.open(filename)
cv_img = adaptors.PIL2Ipl(pil_img)
highgui.cvNamedWindow("pil2ipl")
highgui.cvShowImage("pil2ipl", cv_img)
然而,這並沒有解決的事實cv.cvSetData()
函數總是失敗(使用當前的SWIG包裝器實現)。 然後,您可以使用新的風格的包裝,它允許您使用cv.SetData()
功能,你會期望:
# PIL to OpenCV using the new wrapper
import cv
import PIL
pil_img = PIL.Image.open(filename)
cv_img = cv.CreateImageHeader(pil_img.size, cv.IPL_DEPTH_8U, 3) # RGB image
cv.SetData(cv_img, pil_img.tostring(), pil_img.size[0]*3)
cv.NamedWindow("pil2ipl")
cv.ShowImage("pil2ipl", cv_img)
第三種方法是你的OpenCV的Python接口切換到ctypes-based wrapper。它帶有實用功能,可在例如python字符串和C緩衝區。快速瀏覽google code search似乎表明這是一種工作方法。
關於cvSetData()
函數的第三個參數,圖像緩衝區的大小,但圖像的步驟。步驟是圖像的一行中的字節數,即pixel_depth * number_of_channels * image_width
。 pixel_depth
參數是與一個通道關聯的數據的大小(以字節爲單位)。在你的例子中,它只是圖像的寬度(只有一個通道,每個像素一個字節)。
你在上面鍵入的代碼中有(cvSetData)一個未定義的名稱,所以它的很難知道你是否真的嘗試過。 – 2009-10-30 15:47:17
@Jonathan:我沒有看到你提到的錯誤。 cvSetData的確是一個在opencv.cv中定義的有效函數 – Arkady 2009-10-30 16:22:54
當前答案的狀態是什麼? – 2010-04-13 20:45:01