Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Segmentation Fault #34

Open
mark-belbin opened this issue Mar 9, 2021 · 3 comments
Open

Segmentation Fault #34

mark-belbin opened this issue Mar 9, 2021 · 3 comments

Comments

@mark-belbin
Copy link

I receive a segmentation fault when using this library on a Raspberry Pi 4 and python 3.7. When the entire script exits a seg fault pops up. I've attached the following gdb excerpt:

[Thread 0x9e2fc460 (LWP 4283) exited]
[Thread 0x9f2fd460 (LWP 4282) exited]
[Thread 0xa02fe460 (LWP 4281) exited]
[Thread 0xa12ff460 (LWP 4280) exited]
Thread 1 "python" received signal SIGSEGV, Segmentation fault.
0xaaa33ae8 in quick_decode_uninit ()
   from /home/pi/.local/lib/python3.7/site-packages/pupil_apriltags/lib/libapriltag.so.3
(gdb) backtrace
#0  0xaaa33ae8 in quick_decode_uninit ()
    at /home/pi/.local/lib/python3.7/site-packages/pupil_apriltags/lib/libapriltag.so.3
#1  0xaaa34010 in apriltag_detector_clear_families ()
    at /home/pi/.local/lib/python3.7/site-packages/pupil_apriltags/lib/libapriltag.so.3
(gdb) 

The library works fine on windows with the same code, any ideas what would be causing this on a Pi 4?

@aaronglennshepherd
Copy link

Receiving same issue. Has there been a resolution?

Pi4
Python 3.7.3

Segfault appearing in this portion of code:
at_detector = Detector(families='tag36h11',
nthreads=2,
quad_decimate=1.0,
quad_sigma=0.0,
refine_edges=1,
decode_sharpening=0.25,
debug=0)

Appears to be slightly more stable when nthreads=2 (skips my image if all tags are detected) and crashes if nthreads=1.

Thanks,
Aaron

@aaronglennshepherd
Copy link

This is related to either filesize or ratio of resolution.

Attached is some minimum reproducible code. I tried as-is (file size 2028 x 1520 which maybe isn't a standard) and mostly consistently was able to get 10 loops before the segmentation error. I then reduced the resolution to 720x480 and was able to get 1000+ loops without issue.

The image I tested with is here: https://neoconinc-my.sharepoint.com/:i:/g/personal/ashepherd_neoconhfx_com/ETLrI41fyORAswLsMXFJPmYBRIDx9CtF4ZF-K4tqyGcSeQ?e=ph8BwU

`import cv2
from pupil_apriltags import Detector

for z in range(1,50):

image = cv2.imread('3333.jpg')
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
image = cv2.resize(image,(720,480))
tag_id = 0
at_detector = Detector(families='tag36h11',
                       nthreads=1,
                       quad_decimate=1.0,
                       quad_sigma=0.0,
                       refine_edges=1,
                       decode_sharpening=0.25,
                       debug=0)

tags = at_detector.detect(image, estimate_tag_pose=False, camera_params=None, tag_size=None)

# loop over the AprilTag detection results
for r in tags:
    # extract the bounding box (x, y)-coordinates for the AprilTag
    # and convert each of the (x, y)-coordinate pairs to integers
    (ptA, ptB, ptC, ptD) = r.corners
    ptB = (int(ptB[0]), int(ptB[1]))
    ptC = (int(ptC[0]), int(ptC[1]))
    ptD = (int(ptD[0]), int(ptD[1]))
    ptA = (int(ptA[0]), int(ptA[1]))
    # draw the bounding box of the AprilTag detection
    cv2.line(image, ptA, ptB, (0, 255, 0), 2)
    cv2.line(image, ptB, ptC, (0, 255, 0), 2)
    cv2.line(image, ptC, ptD, (0, 255, 0), 2)
    cv2.line(image, ptD, ptA, (0, 255, 0), 2)
    # draw the center (x, y)-coordinates of the AprilTag
    (cX, cY) = (int(r.center[0]), int(r.center[1]))
    # if debugging is True:
    #    print ('tag center location is ' + str(cX) + ', ' + str(cY) + ' and ID # is ' + str(r.tag_id))
    cv2.circle(image, (cX, cY), 5, (0, 0, 255), -1)
    # draw the tag ID on the image
    cv2.putText(image, str(r.tag_id), (ptA[0], ptA[1] - 15),
                cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)

# show the image, provide window name first
cv2.imshow('step ' + str(z), image)

# add wait key. window waits until user presses a key
cv2.waitKey(1000)
# and finally destroy/close all open windows
cv2.destroyAllWindows()
print(str(z))

next

`

@AbdelNabut
Copy link

AbdelNabut commented Oct 8, 2021

I'm on a Raspberry Pi 4 and my solution to fixing this was to optimize my code so as to not run anything unnecessarily in a while loop. For me this was setting at_detector once at the start. I also ran the optimizations mentioned above, but they didn't help me as much as refactoring my code.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants