The only way is to count them or (re)request them via WP_Query.
I think I prefer the first solution because it's the less complex.

    <?php if (have_posts()) : ?>
        <?php
        // We change the definition of the array to be able to store the count of each post_type
        $types = array('post' => 0, 'videos' => 0, 'graphics' => 0, 'photos' => 0);
        while (have_posts()) {
            the_post();
            // We check that only allowed post_type are counted
            if (array_key_exists(get_post_type(), $types)) {
                $types[get_post_type()]++;
            }
        }
        ?>
        <?php foreach ($types AS $type => $nb_of_type) : ?>
            <?php // We only show post_types that have at least one result  ?>
            <?php if ($nb_of_type > 0) : ?>
                <div class="card">
                    <div class="card-header">
                        <h4><?= $type; ?></h4>
                    </div>
    
                    <div class="card-body">
                        <?php while (have_posts()) : the_post(); ?>
                            <?php if (get_post_type() === $type) : ?>
                                <?php get_template_part('template-part/content', $type); ?>
                            <?php endif; ?>
                        <?php endwhile; ?>
                    </div>
                </div>
            <?php endif; ?>
        <?php endforeach; ?>
    <?php endif; ?>