@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.
Files changed (285) hide show
  1. package/package.json +2 -2
  2. package/skills/01_Meta-Skills/academic-research-hub/SKILL.md +108 -0
  3. package/skills/01_Meta-Skills/academic-research-hub/scripts/requirements.txt +17 -0
  4. package/skills/01_Meta-Skills/academic-research-hub/scripts/research.py +781 -0
  5. package/skills/01_Meta-Skills/beautiful-log/SKILL.md +64 -0
  6. package/skills/01_Meta-Skills/beautiful-log/scripts/beautiful_log.py +274 -0
  7. package/skills/01_Meta-Skills/ethoclaw-daily-paper/SKILL.md +130 -0
  8. package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/config.template.yaml +54 -0
  9. package/skills/01_Meta-Skills/ethoclaw-daily-paper/assets/top5_digest_template.md +5 -0
  10. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/build_top5_digest.py +300 -0
  11. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/common.py +137 -0
  12. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/merge_results.py +106 -0
  13. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/run_pipeline.py +177 -0
  14. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_arxiv.py +162 -0
  15. package/skills/01_Meta-Skills/ethoclaw-daily-paper/scripts/search_pubmed.py +202 -0
  16. package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/SKILL.md +173 -0
  17. package/skills/01_Meta-Skills/ethoclaw-normalize-tabular/scripts/normalize_data.py +874 -0
  18. package/skills/01_Meta-Skills/ethoclaw-pdf-research/SKILL.md +134 -0
  19. package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/confirmation-prompts.md +31 -0
  20. package/skills/01_Meta-Skills/ethoclaw-pdf-research/references/output-patterns.md +45 -0
  21. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_markdown_deliverables.py +41 -0
  22. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_research_log.py +84 -0
  23. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/build_summary_md.py +63 -0
  24. package/skills/01_Meta-Skills/ethoclaw-pdf-research/scripts/extract_pdf_bundle.py +140 -0
  25. package/skills/01_Meta-Skills/experiment-controller/SKILL.md +140 -0
  26. package/skills/01_Meta-Skills/knowledge-graph-builder/SKILL.md +366 -0
  27. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/entity_resolution.py +120 -0
  28. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/extraction_prompt_template.txt +19 -0
  29. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/graph_query.py +106 -0
  30. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/hypothesis_cli_reference.py +42 -0
  31. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/new_data_source_template.py +116 -0
  32. package/skills/01_Meta-Skills/knowledge-graph-builder/scripts/requirements.txt +15 -0
  33. package/skills/01_Meta-Skills/method-design/SKILL.md +61 -0
  34. package/skills/01_Meta-Skills/multi-search-engine/SKILL.md +119 -0
  35. package/skills/01_Meta-Skills/research-idea/SKILL.md +65 -0
  36. package/skills/05_EEG_ERP/eeg-skill/SKILL.md +197 -0
  37. package/skills/05_EEG_ERP/meg-skill/SKILL.md +188 -0
  38. package/skills/05_EEG_ERP/meg-skill/scripts/time_frequency.py +223 -0
  39. package/skills/05_EEG_ERP/mne-eeg-tool/SKILL.md +165 -0
  40. package/skills/05_EEG_ERP/mne-eeg-tool/scripts/eeg_pipeline_reference.py +231 -0
  41. package/skills/05_EEG_ERP/seed-iv-skill/SKILL.md +184 -0
  42. package/skills/05_EEG_ERP/seed-iv-skill/scripts/classify_seed_iv.py +154 -0
  43. package/skills/05_EEG_ERP/seed-iv-skill/scripts/extract_seed_iv_features.py +190 -0
  44. package/skills/05_EEG_ERP/seed-iv-skill/scripts/validate_seed_iv.py +102 -0
  45. package/skills/05_EEG_ERP/seed-vig-skill/SKILL.md +182 -0
  46. package/skills/05_EEG_ERP/seed-vig-skill/scripts/classify_seed_vig.py +165 -0
  47. package/skills/05_EEG_ERP/seed-vig-skill/scripts/extract_seed_vig_features.py +185 -0
  48. package/skills/05_EEG_ERP/seed-vig-skill/scripts/validate_seed_vig.py +88 -0
  49. package/skills/06_fMRI_Neuroimaging/abcd-skill/SKILL.md +308 -0
  50. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/abcd_qc_summary.py +449 -0
  51. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/extract_abcd_phenotype.py +292 -0
  52. package/skills/06_fMRI_Neuroimaging/abcd-skill/scripts/reorganize_abcd.py +387 -0
  53. package/skills/06_fMRI_Neuroimaging/abide-skill/SKILL.md +302 -0
  54. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/abide_qc_summary.py +317 -0
  55. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/extract_abide_phenotype.py +267 -0
  56. package/skills/06_fMRI_Neuroimaging/abide-skill/scripts/reorganize_abide.py +387 -0
  57. package/skills/06_fMRI_Neuroimaging/adhd200-skill/SKILL.md +244 -0
  58. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/adhd200_qc_summary.py +98 -0
  59. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/extract_adhd200_phenotype.py +134 -0
  60. package/skills/06_fMRI_Neuroimaging/adhd200-skill/scripts/reorganize_adhd200.py +206 -0
  61. package/skills/06_fMRI_Neuroimaging/adni-skill/SKILL.md +358 -0
  62. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_adni_task_files.py +1305 -0
  63. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/generate_vqa_from_tasks.py +766 -0
  64. package/skills/06_fMRI_Neuroimaging/adni-skill/scripts/reorganize_adni.py +491 -0
  65. package/skills/06_fMRI_Neuroimaging/aibl-skill/SKILL.md +295 -0
  66. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/aibl_qc_summary.py +260 -0
  67. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/extract_aibl_phenotype.py +365 -0
  68. package/skills/06_fMRI_Neuroimaging/aibl-skill/scripts/reorganize_aibl.py +394 -0
  69. package/skills/06_fMRI_Neuroimaging/aomic-skill/SKILL.md +292 -0
  70. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/aomic_qc_summary.py +258 -0
  71. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/extract_aomic_phenotype.py +284 -0
  72. package/skills/06_fMRI_Neuroimaging/aomic-skill/scripts/reorganize_aomic.py +322 -0
  73. package/skills/06_fMRI_Neuroimaging/asl-skill/SKILL.md +168 -0
  74. package/skills/06_fMRI_Neuroimaging/asl-skill/scripts/compute_cbf.py +224 -0
  75. package/skills/06_fMRI_Neuroimaging/bids-organizer/SKILL.md +241 -0
  76. package/skills/06_fMRI_Neuroimaging/bold5000-skill/SKILL.md +186 -0
  77. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/bold5000_qc_summary.py +96 -0
  78. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/extract_bold5000_stimulus.py +125 -0
  79. package/skills/06_fMRI_Neuroimaging/bold5000-skill/scripts/reorganize_bold5000.py +102 -0
  80. package/skills/06_fMRI_Neuroimaging/camcan-skill/SKILL.md +213 -0
  81. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/camcan_qc_summary.py +131 -0
  82. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/extract_camcan_phenotype.py +145 -0
  83. package/skills/06_fMRI_Neuroimaging/camcan-skill/scripts/validate_camcan.py +141 -0
  84. package/skills/06_fMRI_Neuroimaging/cobre-skill/SKILL.md +201 -0
  85. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/cobre_qc_summary.py +95 -0
  86. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/extract_cobre_phenotype.py +104 -0
  87. package/skills/06_fMRI_Neuroimaging/cobre-skill/scripts/reorganize_cobre.py +140 -0
  88. package/skills/06_fMRI_Neuroimaging/conn-tool/SKILL.md +180 -0
  89. package/skills/06_fMRI_Neuroimaging/dcm2nii/SKILL.md +189 -0
  90. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/SKILL.md +183 -0
  91. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/dmt_har_med_qc_summary.py +96 -0
  92. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/extract_dmt_har_med_phenotype.py +121 -0
  93. package/skills/06_fMRI_Neuroimaging/dmt-har-med-skill/scripts/reorganize_dmt_har_med.py +125 -0
  94. package/skills/06_fMRI_Neuroimaging/dwi-skill/SKILL.md +359 -0
  95. package/skills/06_fMRI_Neuroimaging/fmri-skill/SKILL.md +371 -0
  96. package/skills/06_fMRI_Neuroimaging/fmriprep-tool/SKILL.md +228 -0
  97. package/skills/06_fMRI_Neuroimaging/freesurfer-tool/SKILL.md +286 -0
  98. package/skills/06_fMRI_Neuroimaging/freesurfer-tool/scripts/freesurfer_processor.py +145 -0
  99. package/skills/06_fMRI_Neuroimaging/fsl-tool/SKILL.md +208 -0
  100. package/skills/06_fMRI_Neuroimaging/hbn-skill/SKILL.md +271 -0
  101. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/extract_hbn_phenotype.py +107 -0
  102. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/hbn_qc_summary.py +96 -0
  103. package/skills/06_fMRI_Neuroimaging/hbn-skill/scripts/reorganize_hbn.py +150 -0
  104. package/skills/06_fMRI_Neuroimaging/hcpa-skill/SKILL.md +210 -0
  105. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/extract_hcpa_phenotype.py +146 -0
  106. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/hcpa_qc_summary.py +120 -0
  107. package/skills/06_fMRI_Neuroimaging/hcpa-skill/scripts/reorganize_hcpa.py +155 -0
  108. package/skills/06_fMRI_Neuroimaging/hcpd-skill/SKILL.md +210 -0
  109. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/extract_hcpd_phenotype.py +148 -0
  110. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/hcpd_qc_summary.py +125 -0
  111. package/skills/06_fMRI_Neuroimaging/hcpd-skill/scripts/reorganize_hcpd.py +146 -0
  112. package/skills/06_fMRI_Neuroimaging/hcpep-skill/SKILL.md +215 -0
  113. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/extract_hcpep_phenotype.py +157 -0
  114. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/hcpep_qc_summary.py +143 -0
  115. package/skills/06_fMRI_Neuroimaging/hcpep-skill/scripts/reorganize_hcpep.py +146 -0
  116. package/skills/06_fMRI_Neuroimaging/hcppipeline-tool/SKILL.md +217 -0
  117. package/skills/06_fMRI_Neuroimaging/hcpya-skill/SKILL.md +214 -0
  118. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/extract_hcpya_phenotype.py +190 -0
  119. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/hcpya_qc_summary.py +152 -0
  120. package/skills/06_fMRI_Neuroimaging/hcpya-skill/scripts/reorganize_hcpya.py +203 -0
  121. package/skills/06_fMRI_Neuroimaging/ixi-skill/SKILL.md +198 -0
  122. package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/ixi_qc_summary.py +137 -0
  123. package/skills/06_fMRI_Neuroimaging/ixi-skill/scripts/reorganize_ixi.py +190 -0
  124. package/skills/06_fMRI_Neuroimaging/mnd-skill/SKILL.md +191 -0
  125. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/extract_mnd_phenotype.py +143 -0
  126. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/mnd_qc_summary.py +120 -0
  127. package/skills/06_fMRI_Neuroimaging/mnd-skill/scripts/validate_mnd.py +107 -0
  128. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/SKILL.md +203 -0
  129. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/analyze_lesions.py +119 -0
  130. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/longitudinal_lesion.py +148 -0
  131. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/mschallenge_qc_summary.py +132 -0
  132. package/skills/06_fMRI_Neuroimaging/mschallenge-skill/scripts/validate_mschallenge.py +116 -0
  133. package/skills/06_fMRI_Neuroimaging/nibabel-skill/SKILL.md +184 -0
  134. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/atlas_coordinate_reference.py +61 -0
  135. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/freesurfer_io_reference.py +34 -0
  136. package/skills/06_fMRI_Neuroimaging/nibabel-skill/scripts/nifti_inspection_reference.py +35 -0
  137. package/skills/06_fMRI_Neuroimaging/nifd-skill/SKILL.md +205 -0
  138. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/extract_nifd_phenotype.py +132 -0
  139. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/nifd_qc_summary.py +111 -0
  140. package/skills/06_fMRI_Neuroimaging/nifd-skill/scripts/validate_nifd.py +111 -0
  141. package/skills/06_fMRI_Neuroimaging/nii2dcm/SKILL.md +143 -0
  142. package/skills/06_fMRI_Neuroimaging/nilearn-tool/SKILL.md +266 -0
  143. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/connectome_reference.py +65 -0
  144. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/denoise_timeseries_reference.py +58 -0
  145. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/hierarchical_parcellation_reference.py +53 -0
  146. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/kmeans_parcellation_reference.py +53 -0
  147. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/preprocess_bold_reference.py +76 -0
  148. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_dictlearning_reference.py +56 -0
  149. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/rest_ica_reference.py +59 -0
  150. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/second_level_glm_reference.py +58 -0
  151. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/spacenet_classifier_reference.py +59 -0
  152. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/svm_classifier_reference.py +60 -0
  153. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/task_glm_reference.py +63 -0
  154. package/skills/06_fMRI_Neuroimaging/nilearn-tool/scripts/zalff_summary_reference.py +109 -0
  155. package/skills/06_fMRI_Neuroimaging/nsd-skill/SKILL.md +210 -0
  156. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/extract_nsd_stimulus.py +171 -0
  157. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/nsd_qc_summary.py +142 -0
  158. package/skills/06_fMRI_Neuroimaging/nsd-skill/scripts/validate_nsd.py +142 -0
  159. package/skills/06_fMRI_Neuroimaging/oasis-skill/SKILL.md +205 -0
  160. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/extract_oasis_phenotype.py +126 -0
  161. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/oasis_qc_summary.py +115 -0
  162. package/skills/06_fMRI_Neuroimaging/oasis-skill/scripts/validate_oasis.py +119 -0
  163. package/skills/06_fMRI_Neuroimaging/pet-skill/SKILL.md +173 -0
  164. package/skills/06_fMRI_Neuroimaging/pet-skill/scripts/compute_suvr.py +202 -0
  165. package/skills/06_fMRI_Neuroimaging/pnc-skill/SKILL.md +206 -0
  166. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/extract_pnc_phenotype.py +136 -0
  167. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/pnc_qc_summary.py +116 -0
  168. package/skills/06_fMRI_Neuroimaging/pnc-skill/scripts/validate_pnc.py +120 -0
  169. package/skills/06_fMRI_Neuroimaging/ppmi-skill/SKILL.md +209 -0
  170. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/extract_ppmi_phenotype.py +138 -0
  171. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/ppmi_qc_summary.py +111 -0
  172. package/skills/06_fMRI_Neuroimaging/ppmi-skill/scripts/validate_ppmi.py +117 -0
  173. package/skills/06_fMRI_Neuroimaging/qsiprep-tool/SKILL.md +320 -0
  174. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/SKILL.md +215 -0
  175. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/extract_rest_mdd_phenotype.py +132 -0
  176. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/harmonize_sites.py +152 -0
  177. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/rest_mdd_qc_summary.py +124 -0
  178. package/skills/06_fMRI_Neuroimaging/rest-mneta-mdd-skill/scripts/validate_rest_mdd.py +103 -0
  179. package/skills/06_fMRI_Neuroimaging/smri-skill/SKILL.md +302 -0
  180. package/skills/06_fMRI_Neuroimaging/tcp-skill/SKILL.md +204 -0
  181. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/extract_tcp_phenotype.py +139 -0
  182. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/tcp_qc_summary.py +111 -0
  183. package/skills/06_fMRI_Neuroimaging/tcp-skill/scripts/validate_tcp.py +99 -0
  184. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/SKILL.md +217 -0
  185. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/extract_ucla_cnp_phenotype.py +145 -0
  186. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/ucla_cnp_qc_summary.py +111 -0
  187. package/skills/06_fMRI_Neuroimaging/ucla-cnp-skill/scripts/validate_ucla_cnp.py +113 -0
  188. package/skills/06_fMRI_Neuroimaging/ukb-skill/SKILL.md +310 -0
  189. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/build_ukb_survival.py +210 -0
  190. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_cases.py +308 -0
  191. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/extract_ukb_phenotype.py +232 -0
  192. package/skills/06_fMRI_Neuroimaging/ukb-skill/scripts/ukb_qc_summary.py +158 -0
  193. package/skills/06_fMRI_Neuroimaging/wmh-segmentation/SKILL.md +133 -0
  194. package/skills/07_Computational_Modeling/detrending/SKILL.md +118 -0
  195. package/skills/07_Computational_Modeling/dictlearning/SKILL.md +122 -0
  196. package/skills/07_Computational_Modeling/filtering/SKILL.md +121 -0
  197. package/skills/07_Computational_Modeling/glm/SKILL.md +153 -0
  198. package/skills/07_Computational_Modeling/hierarchical/SKILL.md +121 -0
  199. package/skills/07_Computational_Modeling/ica/SKILL.md +122 -0
  200. package/skills/07_Computational_Modeling/kmeans/SKILL.md +119 -0
  201. package/skills/07_Computational_Modeling/run_models/SKILL.md +427 -0
  202. package/skills/07_Computational_Modeling/spacenet/SKILL.md +122 -0
  203. package/skills/07_Computational_Modeling/svm/SKILL.md +120 -0
  204. package/skills/08_Computational_Neuroscience/brain_gnn/SKILL.md +183 -0
  205. package/skills/08_Computational_Neuroscience/dipy-tool/SKILL.md +239 -0
  206. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/dti_metrics_reference.py +70 -0
  207. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/load_and_mask_reference.py +76 -0
  208. package/skills/08_Computational_Neuroscience/dipy-tool/scripts/roi_stats_reference.py +59 -0
  209. package/skills/08_Computational_Neuroscience/fm_app/SKILL.md +195 -0
  210. package/skills/08_Computational_Neuroscience/neurostorm/SKILL.md +151 -0
  211. package/skills/13_Visualization/brain-visualization/SKILL.md +191 -0
  212. package/skills/13_Visualization/brain-visualization/scripts/connectome_reference.py +108 -0
  213. package/skills/13_Visualization/brain-visualization/scripts/freesurfer_ply_reference.py +54 -0
  214. package/skills/13_Visualization/brain-visualization/scripts/zalff_summary_reference.py +116 -0
  215. package/skills/13_Visualization/ethoclaw-paper-figure-layout/SKILL.md +78 -0
  216. package/skills/13_Visualization/ethoclaw-paper-figure-layout/assets/naturecomm_figures.tex +74 -0
  217. package/skills/13_Visualization/ethoclaw-paper-figure-layout/scripts/layout_results_foldered.py +579 -0
  218. package/skills/14_Writing/overleaf-skill/SKILL.md +184 -0
  219. package/skills/14_Writing/overleaf-skill/scripts/install.sh +30 -0
  220. package/skills/14_Writing/paper-writing/SKILL.md +146 -0
  221. package/skills/14_Writing/paper-writing/scripts/data_statement_templates.py +164 -0
  222. package/skills/14_Writing/paper-writing/scripts/figure_templates.py +315 -0
  223. package/skills/14_Writing/paper-writing/scripts/nature_figure_style.py +214 -0
  224. package/skills/14_Writing/paper-writing/scripts/section_phrasebank.py +246 -0
  225. package/skills/16_Animal_Behavior/deeplabcut/SKILL.md +154 -0
  226. package/skills/16_Animal_Behavior/deeplabcut/references/3d-pose.md +89 -0
  227. package/skills/16_Animal_Behavior/deeplabcut/references/maDLC.md +123 -0
  228. package/skills/16_Animal_Behavior/deeplabcut/references/modelzoo.md +98 -0
  229. package/skills/16_Animal_Behavior/deeplabcut/references/standard-pipeline.md +165 -0
  230. package/skills/16_Animal_Behavior/deeplabcut/references/utilities.md +146 -0
  231. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/SKILL.md +274 -0
  232. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.html +112 -0
  233. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/report_template_en.md +21 -0
  234. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/cluster-section.md +5 -0
  235. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/heatmap-section.md +5 -0
  236. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/integrated-interpretation.md +3 -0
  237. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/overview.md +3 -0
  238. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/project-summary.md +3 -0
  239. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/radar-section.md +5 -0
  240. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/raw-trajectory.md +3 -0
  241. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/sample-check.md +3 -0
  242. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/single-subject-section.md +3 -0
  243. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/assets/section_templates/stats-section.md +5 -0
  244. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/epm.md +52 -0
  245. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/fst.md +37 -0
  246. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/nor.md +39 -0
  247. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/oft.md +43 -0
  248. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tcst.md +45 -0
  249. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/experiment-types/tst.md +36 -0
  250. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/input-types.md +59 -0
  251. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/interpretation-guardrails.md +45 -0
  252. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/metadata-schema.md +57 -0
  253. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/report-sections.md +86 -0
  254. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/references/section-selection-rules.md +169 -0
  255. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/build_report_manifest.py +27 -0
  256. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/render_report.py +34 -0
  257. package/skills/16_Animal_Behavior/ethoclaw-analysis-report/scripts/report_utils.py +1121 -0
  258. package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/SKILL.md +390 -0
  259. package/skills/16_Animal_Behavior/ethoclaw-animal-grounding/reference_code.py +98 -0
  260. package/skills/16_Animal_Behavior/ethoclaw-animal-pose-estimation/SKILL.md +336 -0
  261. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/README.md +21 -0
  262. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/SKILL.md +41 -0
  263. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/batch_kinematic_generator.py +663 -0
  264. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/config.json +19 -0
  265. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/generate_kinematic_parameter.py +401 -0
  266. package/skills/16_Animal_Behavior/ethoclaw-kinematic-parameter-generator/kinematic_generator.py +265 -0
  267. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/SKILL.md +72 -0
  268. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/references/config.example.toml +56 -0
  269. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params.py +232 -0
  270. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-clustermap-generate/scripts/cluster_all_params_from_config.py +236 -0
  271. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/SKILL.md +68 -0
  272. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/references/notes.md +5 -0
  273. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-radar-generate/scripts/plot_h5_radar.py +513 -0
  274. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/SKILL.md +52 -0
  275. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/config.toml +81 -0
  276. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/references/stats-rule.md +18 -0
  277. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_inspect.py +79 -0
  278. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_batch.py +624 -0
  279. package/skills/16_Animal_Behavior/ethoclaw-multiparameter-violin-stats-generate/scripts/h5_violin_stats.py +438 -0
  280. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/SKILL.md +280 -0
  281. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_trajectory.py +790 -0
  282. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/core_scripts/heatmap_velocity.py +855 -0
  283. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.csv +101 -0
  284. package/skills/16_Animal_Behavior/ethoclaw-trajectory-velocity-heatmap-generate/reference_data/reference_2d.h5 +0 -0
  285. 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)