简体   繁体   English

使用 Raspberry Pi 4 和 PiCam 时出现分段错误

[英]Segmentation fault while using Raspberry Pi 4 and PiCam

I am working on a project for University, and I am attempting to create a program that takes a picture using the PiCam every 4 seconds or so and then calculates the luminosity of the image.我正在为大学做一个项目,我正在尝试创建一个程序,该程序每 4 秒左右使用 PiCam 拍摄一张照片,然后计算图像的亮度。

The programs functions on the first loop, but it breaks during the second loop when it gives a Segmentation Fault程序在第一个循环中运行,但在第二个循环中出现分段错误时中断

the error is as follows:错误如下:

mmal: mmal_vc_port_enable: failed to enable port vc.null_sink:in:0(OPQV): ENOSPC
mmal: mmal_port_enable: failed to enable connected port (vc.null_sink:in:0(OPQV))0x15fb150 (ENOSPC)
mmal: mmal_connection_enable: output port couldn't be enabled

Backend terminated or disconnected.Fatal Python error: Segmentation fault

Current thread 0xb6f25ad0 (most recent call first):
File "/usr/lib/python3/dist-packages/picamera/mmalobj.py", line 1331 in _get_framesize
File "/usr/lib/python3/dist-packages/picamera/mmalobj.py", line 1325 in __repr__
File "/usr/lib/python3/dist-packages/thonny/backend.py", line 864 in export_value
File "/usr/lib/python3/dist-packages/thonny/backend.py", line 880 in export_variables
File "/usr/lib/python3/dist-packages/thonny/backend.py", line 927 in _export_stack
File "/usr/lib/python3/dist-packages/thonny/backend.py", line 1027 in _prepare_user_exception
File "/usr/lib/python3/dist-packages/thonny/backend.py", line 1218 in wrapper
File "/usr/lib/python3/dist-packages/thonny/backend.py", line 1259 in execute_source
File "/usr/lib/python3/dist-packages/thonny/backend.py", line 815 in _execute_source
File "/usr/lib/python3/dist-packages/thonny/backend.py", line 801 in _execute_file
File "/usr/lib/python3/dist-packages/thonny/backend.py", line 403 in _cmd_Run
File "/usr/lib/python3/dist-packages/thonny/backend.py", line 204 in handle_command
File "/usr/lib/python3/dist-packages/thonny/backend.py", line 146 in mainloop
File "/usr/lib/python3/dist-packages/thonny/backend_launcher.py", line 87 in <module> Use 'Stop/Restart' to restart.

And this is my code:这是我的代码:

import PIL
from PIL import Image
from picamera import PiCamera
from time import sleep

def take_picture():
    #setting the camera
    camera = PiCamera()
    #resolution to (min = 64x64)(max = 2592, 1944)
    camera.resolution = (64, 64)
    #camera take picture
    camera.capture('/home/pi/Desktop/image1.jpg')
#END take_picture
    
def current_average_luma():
    take_picture()
    img = Image.open("/home/pi/Desktop/image1.jpg") #opens image
    
    luma=0 #sum of the luma of each pixels
    pixels = img.width*img.height #number of pixels
    
    for x in range(img.width):
        for y in range(img.height):
            (r, g, b) = img.getpixel((x,y))#get colour touple 
            luma += (0.2126*r + 0.7152*g + 0.0722*b) #calculate luma of RGB data, then add to total
        #END for
    #END for
            
    img.close()#ensure to properly close the image
    return luma/pixels #return average of all pixels
#END average_luma

while (1):
    
    print("the average luma of the image is: ", current_average_luma()) #print light value

    sleep(4)
#END while

I am not sure how to solve this problem, or what is causing it.我不知道如何解决这个问题,或者是什么导致了它。 Any advice is appreciated任何建议表示赞赏

Picture of entire error message整个错误信息的图片

the code was fixed by doing this:通过这样做修复了代码:

from PIL import Image
from picamera import PiCamera
from time import sleep
    
def current_average_luma(camera):
    camera.capture('/home/pi/Desktop/image1.jpg')#camera take picture
    img = Image.open("/home/pi/Desktop/image1.jpg") #opens image
    
    luma=0 #sum of the luma of each pixels
    pixels = img.width*img.height #number of pixels
    
    for x in range(img.width):
        for y in range(img.height):
            (r, g, b) = img.getpixel((x,y))#get colour touple 
            luma += (0.2126*r + 0.7152*g + 0.0722*b) #calculate luma of RGB data, then add to total
        #END for
    #END for
            
    img.close()#ensure to properly close the image
    return luma/pixels #return average of all pixels
#END average_luma


#MAIN
camera = PiCamera()#setting the camera
camera.resolution = (64, 64)#set resolution

while (1):   
    print("the average luma of the image is: ", current_average_luma(camera)) #print light value

    sleep(4)
#END while

The issue was that the repeated function call of take_picture() created multiple camera objects, and thus created a conflict.问题是 take_picture() 的重复函数调用创建了多个相机对象,从而产生了冲突。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM