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

argument 4: <class 'TypeError'>: expected LP__CameraSpacePoint instance instead of LP__CameraSpacePoint #112

Open
sean195114 opened this issue May 6, 2024 · 0 comments

Comments

@sean195114
Copy link

this is my code , and it always has this problem. Can someone help me, many thx.

import comtypes
import ctypes
import _ctypes
from ctypes import sizeof, alignment
from ctypes import POINTER, c_ushort
import pygame
import numpy
import sys
import cv2
import numpy as np
import math

from pykinect2 import PyKinectV2
from pykinect2.PyKinectV2 import *
from pykinect2 import PyKinectRuntime
import mapper
import time
time.clock = time.time

Initialize Kinect

kinect = PyKinectRuntime.PyKinectRuntime(PyKinectV2.FrameSourceTypes_Color | PyKinectV2.FrameSourceTypes_Depth)

class _CameraSpacePoint(ctypes.Structure):
fields = [
('x', ctypes.c_float),
('y', ctypes.c_float),
('z', ctypes.c_float),
]
def depth_space_2_world_depth(depth_map, x, y):
"""
Return depth of object given the depth map coordinates
:param depth_map: kinect.get_last_depth_frame
:param x: depth pixel x
:param y: depth pixel y
:return: depth z of object
"""
if int(y) * 512 + int(x) <= 512 * 424:
return float(depth_map[int(y) * 512 + int(x)]) # mm
else:
# If it exceeds return the last value to catch overflow
return float(depth_map[512*424])

def color_2_world(kinect, depth_frame_data, camera_space_point, as_array=False):
"""
Map Color Frame to World Space
:param kinect: Class for main file
:param depth_frame_data: kinect._depth_frame_data
:param camera_space_point: _CameraSpacePoint structure from PyKinectV2
:param as_array: returns frame as numpy array
:return: returns mapped color frame to camera space
COMMETHOD([], HRESULT, 'MapColorFrameToCameraSpace',
( [], c_uint, 'depthDataPointCount' ),
( ['in'], POINTER(c_ushort), 'depthFrameData' ),
( [], c_uint, 'cameraPointCount' ),
( [], POINTER(_CameraSpacePoint), 'cameraSpacePoints' )),
"""
color2world_points_type = _CameraSpacePoint * np.int(1920 * 1080)
color2world_points = ctypes.cast(color2world_points_type(), ctypes.POINTER(_CameraSpacePoint))
kinect._mapper.MapColorFrameToCameraSpace(ctypes.c_uint(512 * 424), kinect._depth_frame_data, ctypes.c_uint(1920 * 1080), color2world_points)
pf_csps = ctypes.cast(color2world_points, ctypes.POINTER(ctypes.c_float))
data = np.ctypeslib.as_array(pf_csps, shape=(1080, 1920, 3))
if not as_array:
return color2world_points
else:
return data

camera_space_point = _CameraSpacePoint()

while True:
# Capture color image and depth information
if kinect.has_new_color_frame() and kinect.has_new_depth_frame() :
# Get color image
frame = kinect.get_last_color_frame()
frame = frame.reshape((kinect.color_frame_desc.Height, kinect.color_frame_desc.Width, 4)).astype(np.uint8)

    # Get depth value of object from depth information
    depth_frame = kinect.get_last_depth_frame()
    depth_image = depth_frame.reshape((kinect.depth_frame_desc.Height, kinect.depth_frame_desc.Width, 1)).astype(np.uint8)

    # Convert image to HSV color space
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # Define the HSV range for blue color
    lower_blue = np.array([100, 100, 100])
    upper_blue = np.array([140, 255, 255])

    # Build a mask to mark the blue parts
    mask = cv2.inRange(hsv, lower_blue, upper_blue)

    # Find contours of the blue object
    contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    # If contours are found, display them on the image
    if contours:
        # Draw each contour
        for cnt in contours:
            cv2.drawContours(frame, [cnt], 0, (0, 255, 0), 2)
            M = cv2.moments(cnt)
            if M["m00"] != 0:
                cx = int(M["m10"] / M["m00"])
                cy = int(M["m01"] / M["m00"])

                depth_point = depth_space_2_world_depth(kinect.get_last_depth_frame(), kinect.depth_frame_desc.Width // 2 , kinect.depth_frame_desc.Height // 2)
                
                # Set the values of _CameraSpacePoint structure
                camera_space_point.x = cx
                camera_space_point.y = cy
                camera_space_point.z = depth_point
                
                # Pass the pointer to color_2_world function
                camera_color_point = color_2_world(kinect, depth_frame, camera_space_point, as_array=False)
                

                # Get the corresponding world coordinates from the mapped result
                x_world = camera_color_point.contents.x
                y_world = camera_color_point.contents.y
                z_world = camera_color_point.contents.z

                # Ensure the visibility and clarity of text position and color
                cv2.putText(frame, f'X: {x_world:.2f} Y: {y_world:.2f} Z: {z_world:.2f}', (10, 50), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2)

    # Display the color and depth images
    cv2.imshow('Color Frame', frame)
    depth_colormap = cv2.applyColorMap(cv2.convertScaleAbs(depth_image, alpha=0.03), cv2.COLORMAP_JET)
    cv2.imshow('Depth Frame', depth_colormap)
    
    # Press 'q' to exit the loop
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

Release the Kinect and close the windows

kinect.close()
cv2.destroyAllWindows()

ArgumentError Traceback (most recent call last)
in
111
112 # Pass the pointer to color_2_world function
--> 113 camera_color_point = color_2_world(kinect, depth_frame, camera_space_point, as_array=False)
114
115

in color_2_world(kinect, depth_frame_data, camera_space_point, as_array)
57 color2world_points_type = _CameraSpacePoint * np.int(1920 * 1080)
58 color2world_points = ctypes.cast(color2world_points_type(), ctypes.POINTER(_CameraSpacePoint))
---> 59 kinect._mapper.MapColorFrameToCameraSpace(ctypes.c_uint(512 * 424), kinect._depth_frame_data, ctypes.c_uint(1920 * 1080), color2world_points)
60 pf_csps = ctypes.cast(color2world_points, ctypes.POINTER(ctypes.c_float))
61 data = np.ctypeslib.as_array(pf_csps, shape=(1080, 1920, 3))

ArgumentError: argument 4: <class 'TypeError'>: expected LP__CameraSpacePoint instance instead of LP__CameraSpacePoint

def color_2_world(kinect, depth_frame_data, camera_space_point, as_array=False): I think the error happens due to here!

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

1 participant