@brainpilot/skills 0.0.6 → 0.0.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +2 -2
- package/skills/01_Meta-Skills/academic-research-hub/SKILL.md +108 -0
- package/skills/01_Meta-Skills/academic-research-hub/scripts/requirements.txt +17 -0
- package/skills/01_Meta-Skills/academic-research-hub/scripts/research.py +781 -0
- package/skills/01_Meta-Skills/beautiful-log/SKILL.md +64 -0
- package/skills/01_Meta-Skills/beautiful-log/scripts/beautiful_log.py +274 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/SKILL.md +130 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/config.template.yaml +54 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/top5_digest_template.md +5 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/build_top5_digest.py +300 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/common.py +137 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/merge_results.py +106 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/run_pipeline.py +177 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_arxiv.py +162 -0
- package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_pubmed.py +202 -0
- package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/SKILL.md +173 -0
- package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/scripts/normalize_data.py +874 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/SKILL.md +134 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/confirmation-prompts.md +31 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/output-patterns.md +45 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_markdown_deliverables.py +41 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_research_log.py +84 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_summary_md.py +63 -0
- package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/extract_pdf_bundle.py +140 -0
- package/skills/01_Meta-Skills/experiment-controller/SKILL.md +140 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/SKILL.md +366 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/entity_resolution.py +120 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/extraction_prompt_template.txt +19 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/graph_query.py +106 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/hypothesis_cli_reference.py +42 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/new_data_source_template.py +116 -0
- package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/requirements.txt +15 -0
- package/skills/01_Meta-Skills/method-design/SKILL.md +61 -0
- package/skills/01_Meta-Skills/multi-search-engine/SKILL.md +119 -0
- package/skills/01_Meta-Skills/research-idea/SKILL.md +65 -0
- package/skills/05_EEG_ERP/eeg-skill/SKILL.md +197 -0
- package/skills/05_EEG_ERP/meg-skill/SKILL.md +188 -0
- package/skills/05_EEG_ERP/meg-skill/scripts/time_frequency.py +223 -0
- package/skills/05_EEG_ERP/mne-eeg-tool/SKILL.md +165 -0
- package/skills/05_EEG_ERP/mne-eeg-tool/scripts/eeg_pipeline_reference.py +231 -0
- package/skills/05_EEG_ERP/seed-iv-skill/SKILL.md +184 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/classify_seed_iv.py +154 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/extract_seed_iv_features.py +190 -0
- package/skills/05_EEG_ERP/seed-iv-skill/scripts/validate_seed_iv.py +102 -0
- package/skills/05_EEG_ERP/seed-vig-skill/SKILL.md +182 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/classify_seed_vig.py +165 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/extract_seed_vig_features.py +185 -0
- package/skills/05_EEG_ERP/seed-vig-skill/scripts/validate_seed_vig.py +88 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/SKILL.md +308 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/abcd_qc_summary.py +449 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/extract_abcd_phenotype.py +292 -0
- package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/reorganize_abcd.py +387 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/SKILL.md +302 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/abide_qc_summary.py +317 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/extract_abide_phenotype.py +267 -0
- package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/reorganize_abide.py +387 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/SKILL.md +244 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/adhd200_qc_summary.py +98 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/extract_adhd200_phenotype.py +134 -0
- package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/reorganize_adhd200.py +206 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/SKILL.md +358 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_adni_task_files.py +1305 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_vqa_from_tasks.py +766 -0
- package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/reorganize_adni.py +491 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/SKILL.md +295 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/aibl_qc_summary.py +260 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/extract_aibl_phenotype.py +365 -0
- package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/reorganize_aibl.py +394 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/SKILL.md +292 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/aomic_qc_summary.py +258 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/extract_aomic_phenotype.py +284 -0
- package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/reorganize_aomic.py +322 -0
- package/skills/06_fMRI_Neuroimaging/asl-skill/SKILL.md +168 -0
- package/skills/06_fMRI_Neuroimaging/asl-skill/scripts/compute_cbf.py +224 -0
- package/skills/06_fMRI_Neuroimaging/bids-organizer/SKILL.md +241 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/SKILL.md +186 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/bold5000_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/extract_bold5000_stimulus.py +125 -0
- package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/reorganize_bold5000.py +102 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/SKILL.md +213 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/camcan_qc_summary.py +131 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/extract_camcan_phenotype.py +145 -0
- package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/validate_camcan.py +141 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/SKILL.md +201 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/cobre_qc_summary.py +95 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/extract_cobre_phenotype.py +104 -0
- package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/reorganize_cobre.py +140 -0
- package/skills/06_fMRI_Neuroimaging/conn-tool/SKILL.md +180 -0
- package/skills/06_fMRI_Neuroimaging/dcm2nii/SKILL.md +189 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/SKILL.md +183 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/dmt_har_med_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/extract_dmt_har_med_phenotype.py +121 -0
- package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/reorganize_dmt_har_med.py +125 -0
- package/skills/06_fMRI_Neuroimaging/dwi-skill/SKILL.md +359 -0
- package/skills/06_fMRI_Neuroimaging/fmri-skill/SKILL.md +371 -0
- package/skills/06_fMRI_Neuroimaging/fmriprep-tool/SKILL.md +228 -0
- package/skills/06_fMRI_Neuroimaging/freesurfer-tool/SKILL.md +286 -0
- package/skills/06_fMRI_Neuroimaging/freesurfer-tool/scripts/freesurfer_processor.py +145 -0
- package/skills/06_fMRI_Neuroimaging/fsl-tool/SKILL.md +208 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/SKILL.md +271 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/extract_hbn_phenotype.py +107 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/hbn_qc_summary.py +96 -0
- package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/reorganize_hbn.py +150 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/extract_hcpa_phenotype.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/hcpa_qc_summary.py +120 -0
- package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/reorganize_hcpa.py +155 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/extract_hcpd_phenotype.py +148 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/hcpd_qc_summary.py +125 -0
- package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/reorganize_hcpd.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/SKILL.md +215 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/extract_hcpep_phenotype.py +157 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/hcpep_qc_summary.py +143 -0
- package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/reorganize_hcpep.py +146 -0
- package/skills/06_fMRI_Neuroimaging/hcppipeline-tool/SKILL.md +217 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/SKILL.md +214 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/extract_hcpya_phenotype.py +190 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/hcpya_qc_summary.py +152 -0
- package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/reorganize_hcpya.py +203 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/SKILL.md +198 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/ixi_qc_summary.py +137 -0
- package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/reorganize_ixi.py +190 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/SKILL.md +191 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/extract_mnd_phenotype.py +143 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/mnd_qc_summary.py +120 -0
- package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/validate_mnd.py +107 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/SKILL.md +203 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/analyze_lesions.py +119 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/longitudinal_lesion.py +148 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/mschallenge_qc_summary.py +132 -0
- package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/validate_mschallenge.py +116 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/SKILL.md +184 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/atlas_coordinate_reference.py +61 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/freesurfer_io_reference.py +34 -0
- package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/nifti_inspection_reference.py +35 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/SKILL.md +205 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/extract_nifd_phenotype.py +132 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/nifd_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/validate_nifd.py +111 -0
- package/skills/06_fMRI_Neuroimaging/nii2dcm/SKILL.md +143 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/SKILL.md +266 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/connectome_reference.py +65 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/denoise_timeseries_reference.py +58 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/hierarchical_parcellation_reference.py +53 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/kmeans_parcellation_reference.py +53 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/preprocess_bold_reference.py +76 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_dictlearning_reference.py +56 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_ica_reference.py +59 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/second_level_glm_reference.py +58 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/spacenet_classifier_reference.py +59 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/svm_classifier_reference.py +60 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/task_glm_reference.py +63 -0
- package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/zalff_summary_reference.py +109 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/SKILL.md +210 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/extract_nsd_stimulus.py +171 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/nsd_qc_summary.py +142 -0
- package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/validate_nsd.py +142 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/SKILL.md +205 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/extract_oasis_phenotype.py +126 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/oasis_qc_summary.py +115 -0
- package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/validate_oasis.py +119 -0
- package/skills/06_fMRI_Neuroimaging/pet-skill/SKILL.md +173 -0
- package/skills/06_fMRI_Neuroimaging/pet-skill/scripts/compute_suvr.py +202 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/SKILL.md +206 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/extract_pnc_phenotype.py +136 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/pnc_qc_summary.py +116 -0
- package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/validate_pnc.py +120 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/SKILL.md +209 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/extract_ppmi_phenotype.py +138 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/ppmi_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/validate_ppmi.py +117 -0
- package/skills/06_fMRI_Neuroimaging/qsiprep-tool/SKILL.md +320 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/SKILL.md +215 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/extract_rest_mdd_phenotype.py +132 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/harmonize_sites.py +152 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/rest_mdd_qc_summary.py +124 -0
- package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/validate_rest_mdd.py +103 -0
- package/skills/06_fMRI_Neuroimaging/smri-skill/SKILL.md +302 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/SKILL.md +204 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/extract_tcp_phenotype.py +139 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/tcp_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/validate_tcp.py +99 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/SKILL.md +217 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/extract_ucla_cnp_phenotype.py +145 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/ucla_cnp_qc_summary.py +111 -0
- package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/validate_ucla_cnp.py +113 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/SKILL.md +310 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/build_ukb_survival.py +210 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_cases.py +308 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_phenotype.py +232 -0
- package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/ukb_qc_summary.py +158 -0
- package/skills/06_fMRI_Neuroimaging/wmh-segmentation/SKILL.md +133 -0
- package/skills/07_Computational_Modeling/detrending/SKILL.md +118 -0
- package/skills/07_Computational_Modeling/dictlearning/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/filtering/SKILL.md +121 -0
- package/skills/07_Computational_Modeling/glm/SKILL.md +153 -0
- package/skills/07_Computational_Modeling/hierarchical/SKILL.md +121 -0
- package/skills/07_Computational_Modeling/ica/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/kmeans/SKILL.md +119 -0
- package/skills/07_Computational_Modeling/run_models/SKILL.md +427 -0
- package/skills/07_Computational_Modeling/spacenet/SKILL.md +122 -0
- package/skills/07_Computational_Modeling/svm/SKILL.md +120 -0
- package/skills/08_Computational_Neuroscience/brain_gnn/SKILL.md +183 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/SKILL.md +239 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/dti_metrics_reference.py +70 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/load_and_mask_reference.py +76 -0
- package/skills/08_Computational_Neuroscience/dipy-tool/scripts/roi_stats_reference.py +59 -0
- package/skills/08_Computational_Neuroscience/fm_app/SKILL.md +195 -0
- package/skills/08_Computational_Neuroscience/neurostorm/SKILL.md +151 -0
- package/skills/13_Visualization/brain-visualization/SKILL.md +191 -0
- package/skills/13_Visualization/brain-visualization/scripts/connectome_reference.py +108 -0
- package/skills/13_Visualization/brain-visualization/scripts/freesurfer_ply_reference.py +54 -0
- package/skills/13_Visualization/brain-visualization/scripts/zalff_summary_reference.py +116 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/SKILL.md +78 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/assets/naturecomm_figures.tex +74 -0
- package/skills/13_Visualization/ethoclaw-paper-figure-layout/scripts/layout_results_foldered.py +579 -0
- package/skills/14_Writing/overleaf-skill/SKILL.md +184 -0
- package/skills/14_Writing/overleaf-skill/scripts/install.sh +30 -0
- package/skills/14_Writing/paper-writing/SKILL.md +146 -0
- package/skills/14_Writing/paper-writing/scripts/data_statement_templates.py +164 -0
- package/skills/14_Writing/paper-writing/scripts/figure_templates.py +315 -0
- package/skills/14_Writing/paper-writing/scripts/nature_figure_style.py +214 -0
- package/skills/14_Writing/paper-writing/scripts/section_phrasebank.py +246 -0
- package/skills/16_Animal_Behavior/deeplabcut/SKILL.md +154 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/3d-pose.md +89 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/maDLC.md +123 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/modelzoo.md +98 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/standard-pipeline.md +165 -0
- package/skills/16_Animal_Behavior/deeplabcut/references/utilities.md +146 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/SKILL.md +274 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.html +112 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.md +21 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/cluster-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/heatmap-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/integrated-interpretation.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/overview.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/project-summary.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/radar-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/raw-trajectory.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/sample-check.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/single-subject-section.md +3 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/stats-section.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/epm.md +52 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/fst.md +37 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/nor.md +39 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/oft.md +43 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tcst.md +45 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tst.md +36 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/input-types.md +59 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/interpretation-guardrails.md +45 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/metadata-schema.md +57 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/report-sections.md +86 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/section-selection-rules.md +169 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/build_report_manifest.py +27 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/render_report.py +34 -0
- package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/report_utils.py +1121 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/SKILL.md +390 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/reference_code.py +98 -0
- package/skills/16_Animal_Behavior/ethoclaw-animal-pose-estimation/SKILL.md +336 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/README.md +21 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/SKILL.md +41 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/batch_kinematic_generator.py +663 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/config.json +19 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/generate_kinematic_parameter.py +401 -0
- package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/kinematic_generator.py +265 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/SKILL.md +72 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/references/config.example.toml +56 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params.py +232 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params_from_config.py +236 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/SKILL.md +68 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/references/notes.md +5 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/scripts/plot_h5_radar.py +513 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/SKILL.md +52 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/config.toml +81 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/references/stats-rule.md +18 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_inspect.py +79 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_batch.py +624 -0
- package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_stats.py +438 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/SKILL.md +280 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_trajectory.py +790 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_velocity.py +855 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.csv +101 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.h5 +0 -0
- package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_data_readme.md +126 -0
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ethoclaw-animal-grounding
|
|
3
|
+
description: Animal center tracking using OpenCV for top-view videos, detecting black mouse body center position and exporting DeepLabCut-compatible results.
|
|
4
|
+
metadata:
|
|
5
|
+
{
|
|
6
|
+
"openclaw":
|
|
7
|
+
{
|
|
8
|
+
"emoji": "🎯",
|
|
9
|
+
"requires": { "python": ["opencv-python", "numpy", "pandas"] },
|
|
10
|
+
"install":
|
|
11
|
+
[
|
|
12
|
+
{
|
|
13
|
+
"id": "pip",
|
|
14
|
+
"kind": "pip",
|
|
15
|
+
"package": "opencv-python",
|
|
16
|
+
"label": "Install OpenCV for computer vision",
|
|
17
|
+
},
|
|
18
|
+
{
|
|
19
|
+
"id": "pip",
|
|
20
|
+
"kind": "pip",
|
|
21
|
+
"package": "numpy",
|
|
22
|
+
"label": "Install NumPy for numerical computing",
|
|
23
|
+
},
|
|
24
|
+
{
|
|
25
|
+
"id": "pip",
|
|
26
|
+
"kind": "pip",
|
|
27
|
+
"package": "pandas",
|
|
28
|
+
"label": "Install Pandas for data handling",
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
"id": "pip",
|
|
32
|
+
"kind": "pip",
|
|
33
|
+
"package": "tables",
|
|
34
|
+
"label": "Install PyTables for HDF5 support",
|
|
35
|
+
},
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
}
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
# Animal Center Tracking (OpenCV-based)
|
|
42
|
+
|
|
43
|
+
Use OpenCV image processing techniques to track the body center position of a black mouse in top-view videos, and export results in DeepLabCut-compatible format.
|
|
44
|
+
|
|
45
|
+
## Supported Scenarios
|
|
46
|
+
|
|
47
|
+
- **Top-view mouse tracking**: Black mouse on light background
|
|
48
|
+
- **Single animal tracking**: One mouse per video
|
|
49
|
+
- **Real-time or recorded video**: Process video files frame by frame
|
|
50
|
+
|
|
51
|
+
## Adjustable Parameters
|
|
52
|
+
|
|
53
|
+
| Parameter | Type | Default | Description |
|
|
54
|
+
| ----------------- | ---- | ------- | -------------------------------------------------- |
|
|
55
|
+
| `threshold_value` | int | 80 | Binary threshold for detecting black mouse (0-255) |
|
|
56
|
+
| `min_area` | int | 300 | Minimum contour area to filter noise (pixels) |
|
|
57
|
+
| `blur_kernel` | int | 5 | Gaussian blur kernel size for noise reduction |
|
|
58
|
+
| `morph_kernel` | int | 5 | Morphological operation kernel size |
|
|
59
|
+
|
|
60
|
+
## Quick Start
|
|
61
|
+
|
|
62
|
+
### Track a Single Video
|
|
63
|
+
|
|
64
|
+
```python
|
|
65
|
+
import cv2
|
|
66
|
+
import numpy as np
|
|
67
|
+
import pandas as pd
|
|
68
|
+
import os
|
|
69
|
+
|
|
70
|
+
# Video path
|
|
71
|
+
video_path = "/path/to/your/video.mp4"
|
|
72
|
+
|
|
73
|
+
# Run tracking
|
|
74
|
+
track_mouse_center(video_path)
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Track with Custom Parameters
|
|
78
|
+
|
|
79
|
+
```python
|
|
80
|
+
# Adjust parameters for different lighting conditions
|
|
81
|
+
track_mouse_center(
|
|
82
|
+
video_path,
|
|
83
|
+
threshold_value=60, # Lower threshold for darker mice
|
|
84
|
+
min_area=500, # Larger minimum area
|
|
85
|
+
blur_kernel=7, # Stronger noise reduction
|
|
86
|
+
morph_kernel=7
|
|
87
|
+
)
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## Parameter Description
|
|
91
|
+
|
|
92
|
+
### Tracking Parameters
|
|
93
|
+
|
|
94
|
+
| Parameter | Type | Default | Description |
|
|
95
|
+
| ----------------- | ---- | -------- | -------------------------------------------------------- |
|
|
96
|
+
| `video_path` | str | Required | Path to input video file |
|
|
97
|
+
| `threshold_value` | int | 80 | Binary threshold (lower values detect darker objects) |
|
|
98
|
+
| `min_area` | int | 300 | Minimum contour area in pixels to be considered as mouse |
|
|
99
|
+
| `blur_kernel` | int | 5 | Gaussian blur kernel size (must be odd number) |
|
|
100
|
+
| `morph_kernel` | int | 5 | Morphological opening kernel size |
|
|
101
|
+
|
|
102
|
+
## Output Results
|
|
103
|
+
|
|
104
|
+
After analysis is complete, the following files will be generated in the same directory as the input video:
|
|
105
|
+
|
|
106
|
+
- **`video_name_tracking.h5`**: HDF5 file containing center coordinate data (DeepLabCut-compatible)
|
|
107
|
+
- **`video_name_tracking.csv`**: CSV file containing center coordinate data (easy to view)
|
|
108
|
+
- **`video_name_tracking.mp4`**: Visualization video with center point annotations
|
|
109
|
+
|
|
110
|
+
### Result Data Structure
|
|
111
|
+
|
|
112
|
+
CSV/H5 files contain the following columns:
|
|
113
|
+
|
|
114
|
+
- `scorer`: "EthoClaw"
|
|
115
|
+
- `bodyparts`: "center"
|
|
116
|
+
- `coords`: Coordinate type (x, y, likelihood)
|
|
117
|
+
|
|
118
|
+
Example data:
|
|
119
|
+
|
|
120
|
+
```
|
|
121
|
+
EthoClaw
|
|
122
|
+
center
|
|
123
|
+
x y likelihood
|
|
124
|
+
0 320.0 240.0 1.0
|
|
125
|
+
1 322.0 238.0 1.0
|
|
126
|
+
2 NaN NaN 0.0 # Detection failed
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Complete Example Script
|
|
130
|
+
|
|
131
|
+
### Complete Video Tracking Example
|
|
132
|
+
|
|
133
|
+
```python
|
|
134
|
+
import cv2
|
|
135
|
+
import numpy as np
|
|
136
|
+
import pandas as pd
|
|
137
|
+
import os
|
|
138
|
+
from pathlib import Path
|
|
139
|
+
|
|
140
|
+
|
|
141
|
+
def track_mouse_center(video_path,
|
|
142
|
+
threshold_value=80,
|
|
143
|
+
min_area=300,
|
|
144
|
+
blur_kernel=5,
|
|
145
|
+
morph_kernel=5):
|
|
146
|
+
"""
|
|
147
|
+
Track black mouse center position in top-view video using OpenCV
|
|
148
|
+
|
|
149
|
+
Parameters:
|
|
150
|
+
-----------
|
|
151
|
+
video_path : str
|
|
152
|
+
Path to input video file
|
|
153
|
+
threshold_value : int
|
|
154
|
+
Binary threshold for detecting black mouse (default 80)
|
|
155
|
+
min_area : int
|
|
156
|
+
Minimum contour area to filter noise (default 300)
|
|
157
|
+
blur_kernel : int
|
|
158
|
+
Gaussian blur kernel size (default 5)
|
|
159
|
+
morph_kernel : int
|
|
160
|
+
Morphological operation kernel size (default 5)
|
|
161
|
+
|
|
162
|
+
Returns:
|
|
163
|
+
--------
|
|
164
|
+
dict : Paths to output files
|
|
165
|
+
"""
|
|
166
|
+
|
|
167
|
+
# Check input file
|
|
168
|
+
if not os.path.exists(video_path):
|
|
169
|
+
raise FileNotFoundError(f"Video file does not exist: {video_path}")
|
|
170
|
+
|
|
171
|
+
# Generate output paths (same directory as input video)
|
|
172
|
+
video_dir = os.path.dirname(video_path)
|
|
173
|
+
video_name = os.path.splitext(os.path.basename(video_path))[0]
|
|
174
|
+
|
|
175
|
+
output_h5 = os.path.join(video_dir, f"{video_name}_tracking.h5")
|
|
176
|
+
output_csv = os.path.join(video_dir, f"{video_name}_tracking.csv")
|
|
177
|
+
output_video = os.path.join(video_dir, f"{video_name}_tracking.mp4")
|
|
178
|
+
|
|
179
|
+
# Open input video
|
|
180
|
+
cap = cv2.VideoCapture(video_path)
|
|
181
|
+
if not cap.isOpened():
|
|
182
|
+
raise ValueError(f"Cannot open video file: {video_path}")
|
|
183
|
+
|
|
184
|
+
# Get video properties
|
|
185
|
+
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
|
186
|
+
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
187
|
+
fps = cap.get(cv2.CAP_PROP_FPS)
|
|
188
|
+
total_frames = int(cap.get(cv2.CAP_PROP_FRAME_COUNT))
|
|
189
|
+
|
|
190
|
+
# Setup output video writer
|
|
191
|
+
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
|
|
192
|
+
out = cv2.VideoWriter(output_video, fourcc, fps, (frame_width, frame_height))
|
|
193
|
+
|
|
194
|
+
# Store tracking results
|
|
195
|
+
tracking_data = {
|
|
196
|
+
'frame': [],
|
|
197
|
+
'center_x': [],
|
|
198
|
+
'center_y': [],
|
|
199
|
+
'likelihood': []
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
frame_count = 0
|
|
203
|
+
|
|
204
|
+
print(f"Starting video processing: {video_path}")
|
|
205
|
+
print(f"Total frames: {total_frames}, Resolution: {frame_width}x{frame_height}, FPS: {fps}")
|
|
206
|
+
|
|
207
|
+
while True:
|
|
208
|
+
ret, frame = cap.read()
|
|
209
|
+
if not ret:
|
|
210
|
+
break
|
|
211
|
+
|
|
212
|
+
frame_count += 1
|
|
213
|
+
|
|
214
|
+
# Image preprocessing
|
|
215
|
+
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
|
216
|
+
blurred = cv2.GaussianBlur(gray, (blur_kernel, blur_kernel), 0)
|
|
217
|
+
|
|
218
|
+
# Binarization (extract black regions)
|
|
219
|
+
_, thresh = cv2.threshold(blurred, threshold_value, 255, cv2.THRESH_BINARY_INV)
|
|
220
|
+
|
|
221
|
+
# Morphological operation (opening to remove noise)
|
|
222
|
+
kernel = np.ones((morph_kernel, morph_kernel), np.uint8)
|
|
223
|
+
mask = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
|
|
224
|
+
|
|
225
|
+
# Find contours
|
|
226
|
+
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
|
227
|
+
|
|
228
|
+
center_x, center_y, likelihood = np.nan, np.nan, 0.0
|
|
229
|
+
|
|
230
|
+
if contours:
|
|
231
|
+
# Find largest contour
|
|
232
|
+
largest_contour = max(contours, key=cv2.contourArea)
|
|
233
|
+
|
|
234
|
+
# Filter small noise
|
|
235
|
+
if cv2.contourArea(largest_contour) > min_area:
|
|
236
|
+
# Calculate contour center (image moments)
|
|
237
|
+
M = cv2.moments(largest_contour)
|
|
238
|
+
if M["m00"] != 0:
|
|
239
|
+
center_x = int(M["m10"] / M["m00"])
|
|
240
|
+
center_y = int(M["m01"] / M["m00"])
|
|
241
|
+
likelihood = 1.0 # Successfully detected
|
|
242
|
+
|
|
243
|
+
# Draw results on frame
|
|
244
|
+
cv2.drawContours(frame, [largest_contour], -1, (0, 255, 0), 2)
|
|
245
|
+
cv2.circle(frame, (center_x, center_y), 5, (0, 0, 255), -1)
|
|
246
|
+
text = f"Center: ({center_x}, {center_y})"
|
|
247
|
+
cv2.putText(frame, text, (center_x - 50, center_y - 20),
|
|
248
|
+
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
|
|
249
|
+
|
|
250
|
+
# Record tracking data
|
|
251
|
+
tracking_data['frame'].append(frame_count)
|
|
252
|
+
tracking_data['center_x'].append(center_x)
|
|
253
|
+
tracking_data['center_y'].append(center_y)
|
|
254
|
+
tracking_data['likelihood'].append(likelihood)
|
|
255
|
+
|
|
256
|
+
# Write to output video
|
|
257
|
+
out.write(frame)
|
|
258
|
+
|
|
259
|
+
# Progress display
|
|
260
|
+
if frame_count % 100 == 0:
|
|
261
|
+
print(f"Progress: {frame_count}/{total_frames} ({frame_count/total_frames*100:.1f}%)")
|
|
262
|
+
|
|
263
|
+
# Release resources
|
|
264
|
+
cap.release()
|
|
265
|
+
out.release()
|
|
266
|
+
|
|
267
|
+
# Create DeepLabCut-compatible DataFrame
|
|
268
|
+
scorer = 'EthoClaw'
|
|
269
|
+
bodypart = 'center'
|
|
270
|
+
|
|
271
|
+
# Build multi-index columns
|
|
272
|
+
columns = pd.MultiIndex.from_tuples([
|
|
273
|
+
(scorer, bodypart, 'x'),
|
|
274
|
+
(scorer, bodypart, 'y'),
|
|
275
|
+
(scorer, bodypart, 'likelihood')
|
|
276
|
+
], names=['scorer', 'bodyparts', 'coords'])
|
|
277
|
+
|
|
278
|
+
# Create DataFrame
|
|
279
|
+
df_data = np.column_stack([
|
|
280
|
+
tracking_data['center_x'],
|
|
281
|
+
tracking_data['center_y'],
|
|
282
|
+
tracking_data['likelihood']
|
|
283
|
+
])
|
|
284
|
+
|
|
285
|
+
df = pd.DataFrame(df_data, columns=columns)
|
|
286
|
+
|
|
287
|
+
# Save as HDF5 format (DeepLabCut-compatible)
|
|
288
|
+
df.to_hdf(output_h5, key='df_with_missing', mode='w')
|
|
289
|
+
|
|
290
|
+
# Save as CSV format
|
|
291
|
+
df.to_csv(output_csv)
|
|
292
|
+
|
|
293
|
+
print(f"\nProcessing complete!")
|
|
294
|
+
print(f"Results saved:")
|
|
295
|
+
print(f" - HDF5: {output_h5}")
|
|
296
|
+
print(f" - CSV: {output_csv}")
|
|
297
|
+
print(f" - Video: {output_video}")
|
|
298
|
+
|
|
299
|
+
return {
|
|
300
|
+
'h5_path': output_h5,
|
|
301
|
+
'csv_path': output_csv,
|
|
302
|
+
'video_path': output_video,
|
|
303
|
+
'total_frames': frame_count
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
|
|
307
|
+
# ==================== User Configuration Area ====================
|
|
308
|
+
|
|
309
|
+
# Video path (Required)
|
|
310
|
+
video_path = "/path/to/your/video.mp4"
|
|
311
|
+
|
|
312
|
+
# Tracking parameters (Optional)
|
|
313
|
+
threshold_value = 80 # Binary threshold (0-255), lower for darker mice
|
|
314
|
+
min_area = 300 # Minimum contour area in pixels
|
|
315
|
+
blur_kernel = 5 # Gaussian blur kernel size
|
|
316
|
+
morph_kernel = 5 # Morphological kernel size
|
|
317
|
+
|
|
318
|
+
# ==================== Run Tracking ====================
|
|
319
|
+
|
|
320
|
+
# Verify video exists
|
|
321
|
+
if not os.path.exists(video_path):
|
|
322
|
+
raise FileNotFoundError(f"Video file does not exist: {video_path}")
|
|
323
|
+
|
|
324
|
+
print(f"Starting mouse center tracking: {video_path}")
|
|
325
|
+
|
|
326
|
+
# Run tracking
|
|
327
|
+
result = track_mouse_center(
|
|
328
|
+
video_path,
|
|
329
|
+
threshold_value=threshold_value,
|
|
330
|
+
min_area=min_area,
|
|
331
|
+
blur_kernel=blur_kernel,
|
|
332
|
+
morph_kernel=morph_kernel
|
|
333
|
+
)
|
|
334
|
+
|
|
335
|
+
print("Tracking complete!")
|
|
336
|
+
print(f"Total frames processed: {result['total_frames']}")
|
|
337
|
+
print(f"Results saved to: {os.path.dirname(video_path)}")
|
|
338
|
+
```
|
|
339
|
+
|
|
340
|
+
## Tracking Method
|
|
341
|
+
|
|
342
|
+
The tracking algorithm follows these steps:
|
|
343
|
+
|
|
344
|
+
1. **Image Preprocessing**
|
|
345
|
+
- Convert to grayscale
|
|
346
|
+
- Apply Gaussian blur to reduce noise
|
|
347
|
+
|
|
348
|
+
2. **Binarization**
|
|
349
|
+
- Use threshold to extract black mouse regions (THRESH_BINARY_INV)
|
|
350
|
+
- Pixels darker than `threshold_value` become white (255)
|
|
351
|
+
|
|
352
|
+
3. **Morphological Operations**
|
|
353
|
+
- Apply opening operation to remove small noise
|
|
354
|
+
|
|
355
|
+
4. **Contour Detection**
|
|
356
|
+
- Find all contours in the binary mask
|
|
357
|
+
- Select the largest contour (assumed to be the mouse)
|
|
358
|
+
|
|
359
|
+
5. **Center Calculation**
|
|
360
|
+
- Use image moments to calculate the centroid of the contour
|
|
361
|
+
- Formula: `cx = M10/M00`, `cy = M01/M00`
|
|
362
|
+
|
|
363
|
+
6. **Result Export**
|
|
364
|
+
- Save coordinates in DeepLabCut-compatible format
|
|
365
|
+
- Generate visualization video with annotations
|
|
366
|
+
|
|
367
|
+
## Notes
|
|
368
|
+
|
|
369
|
+
1. **Video Requirements**:
|
|
370
|
+
- Top-view perspective
|
|
371
|
+
- Black mouse on light background
|
|
372
|
+
- Even lighting conditions
|
|
373
|
+
- Minimal shadows
|
|
374
|
+
|
|
375
|
+
2. **Parameter Tuning**:
|
|
376
|
+
- If mouse is not detected: decrease `threshold_value`
|
|
377
|
+
- If too much noise is detected: increase `min_area` or `blur_kernel`
|
|
378
|
+
- For very small mice: decrease `min_area`
|
|
379
|
+
|
|
380
|
+
3. **Detection Failure**:
|
|
381
|
+
- When mouse is occluded or leaves the frame, `likelihood` will be 0
|
|
382
|
+
- Coordinates will be NaN for failed detections
|
|
383
|
+
|
|
384
|
+
4. **Single Animal Only**:
|
|
385
|
+
- This method tracks only the largest black object
|
|
386
|
+
- For multiple animals, consider using DeepLabCut SuperAnimal models
|
|
387
|
+
|
|
388
|
+
5. **Output Compatibility**:
|
|
389
|
+
- HDF5 format is compatible with DeepLabCut analysis tools
|
|
390
|
+
- CSV format can be opened in Excel or Python pandas
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
# r'C:\Users\Administrator\Desktop\rec-1-con-20250716185626.mp4'
|
|
2
|
+
# 这个文件,我要使用opencv来提取其中的黑色小鼠的轮廓,并且拿到每个轮廓的中心坐标center
|
|
3
|
+
import cv2
|
|
4
|
+
import numpy as np
|
|
5
|
+
|
|
6
|
+
def track_mouse(input_video_path, output_video_path):
|
|
7
|
+
# 1. 打开输入视频
|
|
8
|
+
cap = cv2.VideoCapture(input_video_path)
|
|
9
|
+
|
|
10
|
+
if not cap.isOpened():
|
|
11
|
+
print("错误:无法打开视频文件,请检查路径。")
|
|
12
|
+
return
|
|
13
|
+
|
|
14
|
+
# 获取视频的属性(宽、高、帧率)
|
|
15
|
+
frame_width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
|
|
16
|
+
frame_height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
|
|
17
|
+
fps = cap.get(cv2.CAP_PROP_FPS)
|
|
18
|
+
|
|
19
|
+
# 2. 设置输出视频的 VideoWriter
|
|
20
|
+
# 使用 mp4v 编码器保存为 mp4 格式
|
|
21
|
+
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
|
|
22
|
+
out = cv2.VideoWriter(output_video_path, fourcc, fps, (frame_width, frame_height))
|
|
23
|
+
|
|
24
|
+
# 设定二值化阈值(可根据实际视频亮度微调)
|
|
25
|
+
# 因为小鼠是黑色的,我们将低于该阈值的像素视为小鼠
|
|
26
|
+
THRESHOLD_VALUE = 80
|
|
27
|
+
# 设定最小轮廓面积,过滤掉视频边缘的污渍和噪点
|
|
28
|
+
MIN_AREA = 300
|
|
29
|
+
|
|
30
|
+
frame_count = 0
|
|
31
|
+
|
|
32
|
+
while True:
|
|
33
|
+
ret, frame = cap.read()
|
|
34
|
+
if not ret:
|
|
35
|
+
break # 视频读取完毕
|
|
36
|
+
|
|
37
|
+
frame_count += 1
|
|
38
|
+
|
|
39
|
+
# 3. 图像预处理
|
|
40
|
+
# 转换为灰度图
|
|
41
|
+
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
|
|
42
|
+
|
|
43
|
+
# 使用高斯滤波平滑图像,减少噪点
|
|
44
|
+
blurred = cv2.GaussianBlur(gray, (5, 5), 0)
|
|
45
|
+
|
|
46
|
+
# 4. 二值化处理 (提取黑色区域)
|
|
47
|
+
# THRESH_BINARY_INV 表示:小于 THRESHOLD_VALUE 的像素变白(255),大于的变黑(0)
|
|
48
|
+
# 这样黑色的小鼠在掩膜(mask)中就会变成白色的高亮区域
|
|
49
|
+
_, thresh = cv2.threshold(blurred, THRESHOLD_VALUE, 255, cv2.THRESH_BINARY_INV)
|
|
50
|
+
|
|
51
|
+
# 形态学操作(开运算),去除微小的白点噪点
|
|
52
|
+
kernel = np.ones((5, 5), np.uint8)
|
|
53
|
+
mask = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
|
|
54
|
+
|
|
55
|
+
# 5. 寻找轮廓
|
|
56
|
+
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
|
|
57
|
+
|
|
58
|
+
if contours:
|
|
59
|
+
# 找到面积最大的轮廓(假设视频中面积最大的黑色移动物体就是小鼠)
|
|
60
|
+
largest_contour = max(contours, key=cv2.contourArea)
|
|
61
|
+
|
|
62
|
+
# 过滤掉面积过小的噪点
|
|
63
|
+
if cv2.contourArea(largest_contour) > MIN_AREA:
|
|
64
|
+
|
|
65
|
+
# 6. 计算轮廓的中心坐标 (使用图像矩)
|
|
66
|
+
M = cv2.moments(largest_contour)
|
|
67
|
+
if M["m00"] != 0:
|
|
68
|
+
cX = int(M["m10"] / M["m00"])
|
|
69
|
+
cY = int(M["m01"] / M["m00"])
|
|
70
|
+
else:
|
|
71
|
+
cX, cY = 0, 0
|
|
72
|
+
|
|
73
|
+
# 7. 在原帧上绘制结果
|
|
74
|
+
# 绘制绿色轮廓,线宽为2
|
|
75
|
+
cv2.drawContours(frame, [largest_contour], -1, (0, 255, 0), 2)
|
|
76
|
+
|
|
77
|
+
# 绘制红色中心点
|
|
78
|
+
cv2.circle(frame, (cX, cY), 5, (0, 0, 255), -1)
|
|
79
|
+
|
|
80
|
+
# 在中心点旁边打印坐标文本
|
|
81
|
+
text = f"Center: ({cX}, {cY})"
|
|
82
|
+
cv2.putText(frame, text, (cX - 50, cY - 20),
|
|
83
|
+
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)
|
|
84
|
+
|
|
85
|
+
# 8. 将处理后的帧写入输出视频
|
|
86
|
+
out.write(frame)
|
|
87
|
+
|
|
88
|
+
# 释放资源
|
|
89
|
+
cap.release()
|
|
90
|
+
out.release()
|
|
91
|
+
print(f"处理完成!输出视频已保存至: {output_video_path}")
|
|
92
|
+
|
|
93
|
+
if __name__ == "__main__":
|
|
94
|
+
# 请将此处替换为你的实际视频文件路径
|
|
95
|
+
INPUT_VIDEO = r'input.mp4'
|
|
96
|
+
OUTPUT_VIDEO = r'output.mp4'
|
|
97
|
+
|
|
98
|
+
track_mouse(INPUT_VIDEO, OUTPUT_VIDEO)
|