2010-02-11 64 views
2

我有一臺使用uvcvideo模塊在Linux中運行的網絡攝像頭。我正在使用python應用程序訪問網絡攝像頭並顯示圖像。在linux中模擬設備驅動程序崩潰。有python重新加載它

我想讓python程序處理它,如果網絡攝像頭出於某種原因不再工作。已經通過卸載模塊進行了測試。如果我在運行python代碼之前卸載模塊,可以正常工作,但如果強制卸載使用,我會得到以下反饋。

VIDIOC_DQBUF: Inappropriate ioctl for device 

如果我殺了python代碼,並重新啓動它,整個機器凍結。

我試圖運行的代碼是

import pygame 
import Image 
from pygame.locals import * 
import sys 
import time, os 

import opencv 
from opencv import highgui 

camera = highgui.cvCreateCameraCapture(0) 
fps = 10.0 
pygame.init() 
window = pygame.display.set_mode((640,480)) 
pygame.display.set_caption("WebCam Demo") 
screen = pygame.display.get_surface() 

while True: 
events = pygame.event.get() 
for event in events: 
    if event.type == QUIT or event.type == KEYDOWN: 
    sys.exit(0) 
while True: 
    try: 
    ima = highgui.cvQueryFrame(camera) 
    im = opencv.adaptors.Ipl2PIL(ima) 
    break; 
    except TypeError: 
    print 'No camera' 
    os.system('sudo modprobe uvcvideo') 
    time.sleep(1) 
    camera = highgui.cvCreateCameraCapture(0) 

pg_img = pygame.image.frombuffer(im.tostring(), im.size, im.mode) 
screen.blit(pg_img, (0,0)) 
pygame.display.flip() 
pygame.time.delay(int(1000 * 1.0/fps)) 

它的http://www.jperla.com/blog/2007/09/26/capturing-frames-from-a-webcam-on-linux/修改後的版本它使用openvc版本1.x和2.x版本不

關於如何使這項工作的任何想法?

回答

4

你的意思是USB相機?我不知道在使用模塊時強行卸載,但這不會發生,並且不是模擬相機不能正常工作的原因。嘗試首先適當地處理相機斷開/重新連接。

我不知道你正在嘗試模擬駕駛崩潰時實現什麼,但你不能處理的驅動器崩潰,這可能會導致一個糟糕也好,用戶代碼。一旦內核代碼瘋狂,沒有防禦性編程可以爲你節省。

現在,如果一個錯誤(錯誤是從崩潰不同)驅動程序代碼中出現,那麼就應該退還給你,和所有你能做的就是重試或退出。如果您的應用程序被任何UVC相機使用,請購買尊重UVC的USB攝像頭並使用它(斷開/重新連接)。

至於硬件故障,除了可能設置超時之外,你可以做的事情不多。 什麼,你可以在代碼中做的是,如果你發現一個特定問題的驅動程序,是避免觸發此具體問題。例如,如果您知道從分辨率x到分辨率y的變化會導致凍結照相機或驅動程序哎呀,那就避免它。

但是我不會花費太多時間來處理你不知道的任何關於假想的碰撞。相反,您應該嘗試運行錯誤代碼路徑。例如,如果系統內存不足,會發生什麼情況?或者,如果您的系統負載過高,導致您的應用程序無法跟上傳入的幀。

+0

這是我的筆記本電腦上的內置攝像頭。 – Orjanp 2010-02-11 11:07:59

+0

感謝您的解釋。由於此刻我的問題是理論上的,所以我不會用任何時間來解決它。我會等待看看是否會有真正的問題。 – Orjanp 2010-02-22 12:58:17

1

當你嘗試在任何進程正在使用它時刪除內核驅動程序時,Linux真的不喜歡它。我不相信你的用戶級應用程序有這樣的好方法(並且讓你的應用程序嘗試運行'sudo modprobe uvcvideo'已經足夠可怕了)。

+0

我打算以root身份手動降下相機。該應用程序假設在無人機上的計算機上運行。如果由於某種原因而自動停止工作,則會自動嘗試重新啓動相機。 – Orjanp 2010-02-11 11:10:30

+0

@Orjanp上一句中描述的任務是驅動程序的責任,而不是應用程序代碼。用戶代碼不具有通常需要的直接硬件訪問來執行此操作。如果您的驅動程序沒有正確處理硬件錯誤,請在驅動程序上提供錯誤或(如果您勇敢),請查看您是否可以自己修復驅動程序代碼。 – bta 2010-02-12 00:00:36

+0

我意識到我的理論方法不是最好的。我會反過來看看是否會有真正的問題,螞蟻試圖解決它們。謝謝。 – Orjanp 2010-02-22 13:00:47

2

現在您的代碼崩潰的原因是因爲當司機崩潰,代表你的硬件設備特殊文件消失。您的代碼仍然對這些設備具有打開的文件句柄。根據你的代碼在幕後做了什麼,它可能試圖發佈一個IOCTL到一個現在無效的文件句柄,這個用例通常不能很好地被庫代碼處理,因爲它只會發生在像這樣的事件中帶有某種核心土地故障,用戶土地代碼無論如何都無能爲力。

處理相機,如果它停止工作是完全不同於處理司機崩潰。發生故障的照相機不應取下(正確寫入的)驅動程序。如果驅動程序出現故障,您的用戶級代碼將無法處理這些問題。它也不應該。如果司機崩潰,那是司機作家的問題,而不是你的。如果您的驅動程序經常碰到您經常碰到的問題,那麼我會嘗試使用其他驅動程序或嘗試修復您正在使用的驅動程序。沒有大量的應用程序代碼可以修復錯誤的驅動程序。

不要忘記你的代碼不是使用驅動程序的唯一代碼。內部內核進程或其他應用程序也可能使用該驅動程序。如果別的東西在您使用驅動程序時拉動它,則可能導致其他代碼掛起(超出您的控制範圍),並有可能導致整個系統停機。

現在,如果您的攝像頭硬件出現問題,驅動程序應該優雅地給您發送消息或應用程序代碼可檢測到並執行的某種錯誤,同時執行自己的工作以使相機再次工作。發生故障的硬件不應構成應用程序代碼的負擔;讓司機完成工作,如果可能的話,它會使相機恢復在線狀態。如果無法這樣做,那麼無論相機處於不可恢復狀態還是驅動程序都有改進的空間(如果是這種情況,向驅動程序開發人員提供在硬件上測試其代碼的報價有時可能會很快爲您的設備獲得更好的驅動程序支持的方式)。

我會專注於讓代碼處理驅動程序可以爲您的設備返回的所有可能的錯誤狀態,而不是試圖在驅動程序運行時撕下驅動程序。

+0

感謝您的輸入。 – Orjanp 2010-02-22 13:01:53

相關問題