Feature requests for revo scan with miraco

I just got the miraco and am really enjoying it!
I come from a background of using artec scanners and am missing a few things that allow granular control over the scans.

The miraco automatically merges different scans in the same model according to its own tracking. It would be awesome if these multiple scans were kept independent so I can later clean them up and merge them on the computer. Now I have scans that are misaligned and no way to fix it.
It’s easy if everything goes right, but I don’t think the tech is flawless enough to always get it right, so we need a way to manually fix flaws.

This brings me to the next part. I can edit keyframes independently, but not as a group. It would help alignment if I could just crop out a part that was scanned twice. This could also be done by separating a group of keyframes to a new set. So being able to split up a scan into sets of keyframes.

For textures, I like the results, but it would be nice to have a similar settings menu as fusion or mesh mode, just to dial in some settings like the resolution or maybe color correction.

Apart from those, I think there is a lot of feature parity, so great job there! You’ve made the software easily understandable and easy to use for people who are not used to scanning, without dumbing it down too much (like jmstudio imo)

1 Like

Hi @diepzeevogel !

regarding different scans of same object: After a scan completed and satisfied with the outcome of raw data you can press the check mark (under the red button). by pressing plus symbol (above the red button) then you can add a new scan to the same “project” . These scans can be merged on pc (for now) later.
the alternative is to make a project for each and every scan, but you would have to import them later to one project anyway for merging, which isn´t convenient.
cheers

Oh right, I did that later on! That works if you’re doing it on purpose, but losing tracking would still be a problem when you can’t split up a scan.

When you scan and realize there are some misaligned frames you always can press pause and undo arrows for deleting frames until bad frames are all gone and then continue scanning. Does this help?

1 Like

So true @ivan that what I always do, it saving so much time editing later …

1 Like

It is something I learned i could do from you and it saved me some time , too :grin:
Actually, most of my 3d scanning knowledge is what i got from you and I am just passing it over to other users. THANKS AGAIN, CATH! :pray:

1 Like

You are too kind Ivan … :sparkling_heart:
Thank you :pray: for everything you do in our community!

1 Like

I get that, and I’m guessing there is a learning curve to using this software, coming from artec and jmstudio.
Still would be a nice feature to be able to split an existing scan by keyframes in my opinion.

1 Like

RevoScan is getting greatly improved and fast pace. It isn´t long ago we had RevoScan 4 version. You should take look at those and compare it what we have now. :grin: I only know Revopoint developers are highly productive and listen to their users. I get impressed with practically every new version of RevoScan.
take a dive into Revoscan and keep posting your improvements requests! Revopoint team will not simply ignore them.

It is possible to split them up manually. I have a barebones, poorly coded python script that will take a single scan with multiple stops/starts and create a new project with the pieces as individual scans. I hope to clean it up and share it, but it’s a little dodgy.

I’d love to see your code!
Maybe I can help clean it up, or the revopoint team can implement it in their next update haha :wink:

@diepzeevogel @TheBoatScans

Maybe take a look at my Revoscan Player, a lot of usefull stuff already implemented between the main app and the helpers folder.

I have been researching into the idea of adding a timeline editor like the video ones that we could use to split arbitary frames into project scans;

Be able to browse projexts and create a project file from arbitary scan folder for example;

And be able to duplicate a project.

Personally i prefer my current method of removing frames by renaming file extensions to .x and having that way the ability to restore the frames if want to.

Also wanted to add the ability to duplicate scans/projects and rename scan folder on a project manager/bowser like the one i started sketching on the discussion page

I have also started a Github discussion page

And my early development log can be found here in the forum

1 Like

Is this possible in the PC mode also? I find the undo/redo buttons only on Miraco istself…

1 Like

yes , in pc mode it is the same. as soon you press “pause” there is this “undo”-arrow activated. and if you undo something, another arrow gets activated too, for redoing (resp. undoing the “undo” operation)

1 Like

Here you go! I learn Python by necessity, mostly by searching for lots of examples and banging away until it does what I want. It’s not very robust (it will fail if everything isn’t as expected), nor probably very Python-like. Metadata will be mostly wrong as I just copy it from the original (other than a few exceptions).

Make backups and use at your own risk! Feed it the full project file path and name, the index of the scan to split, and a directory to place the new project into. Makes project directory and name based on the name of the scan selected.

Credit to @X3msnake, since I would never have figured out the “indent=4” parameter for the json dump. :slight_smile:

import json, uuid, os, subprocess, glob, copy

#project_file includes full path
#model_num is index of model to split as found under 'nodes' key in project file

def create_project(project_file, model_num, export_path_input):
    new_guid = str(uuid.uuid4())
    project_name=os.path.split(project_file)[1]
    project_path=os.path.normpath(os.path.split(project_file)[0])+'\\'
    export_path=os.path.normpath(export_path_input)+'\\'

    with open(project_file, 'r') as json_file:
        project_data = json.load(json_file)

    model = project_data["nodes"][model_num]

    source_dir = project_path+"data\\"+project_data["nodes"][model_num]["guid"]+"\\cache\\"
    source_dir_model = project_path+"data\\"+project_data["nodes"][model_num]["guid"]+"\\"
    dest_dir = export_path + project_data["nodes"][model_num]["name"]
    dest_dir_data = dest_dir+"\\data\\"

    with open(source_dir_model+"property.rvproj", 'r') as json_file:
        model_properties = json.load(json_file)

    print(source_dir)
    print(dest_dir)

    if not os.path.exists(dest_dir):
        os.mkdir(dest_dir)
        os.mkdir(dest_dir_data)        

    new_project_name = model["name"]
    new_project = project_data
    new_project["guid"] = new_guid
    new_project["name"] = new_project_name
    new_project["nodes"] = []

    components = {}

    x = 0
    searching = True
    filename_to_search = f"{source_dir}\\{x:0>3}_*."

    while searching:
        
        filelist = glob.glob(f"{source_dir}\\frame_{x:0>3}_*.dph")

        if len(filelist) == 0:
            searching = False
            print('While loop ended')
        else:
            components[x] = filelist
            x += 1

    base_name = model['name']

    for a in range(len(components)):
        new_model = model
        new_properties = model_properties
        new_model['name'] = base_name + f'_p{a}'
        new_model['guid'] = base_name + f'_p{a}'
        new_project['nodes'].append(copy.copy(new_model))
        new_properties['guid'] = new_model['name']
        last_frame_num=int(components[a][-1][-8:-4])
        new_properties['vf_count'] = len(components[a])
        new_properties['scan_step'] = 1
        dest_dir_new_name = dest_dir_data+new_model['name']
        dest_dir_cache = dest_dir_new_name+'\\cache\\'

        print("Creating destination directories...")
        os.mkdir(dest_dir_new_name)
        os.mkdir(dest_dir_cache)
        os.mkdir(dest_dir_new_name+'\\param')
        os.mkdir(dest_dir_new_name+'\\dump')
        print(f"Copying files for component {a}...")
        copy_return = subprocess.check_output(["copy", f"{source_dir}frame_{a:0>3}_*.*", dest_dir_cache], shell=True)
        copy_return = subprocess.check_output(["copy", f"{source_dir_model}param\\", dest_dir_new_name+'\\param\\'], shell=True)
        copy_return = subprocess.check_output(["copy", f"{source_dir_model}frameFlag.json", dest_dir_new_name+'\\'], shell=True)

        with open(f"{dest_dir_new_name}\\property.rvproj", "w") as f:
            json.dump(new_properties, f, indent=4)
        
    with open(f"{dest_dir}\\{new_project_name}.revo", "w") as f:
        json.dump(new_project, f, indent=4)

    print('Done.')
    return

1 Like