MoodScanAnalyzer is a desktop app that analyzes emotion logs collected while viewers watched a video (from the MoodScan app) and checks whether the recorded emotions match what the video was intended to evoke (e.g., a joke at 3–5 seconds → the viewer should smile/laugh).
This can be useful for content evaluation and for measuring the emotional impact of advertising campaigns.
This project is part of a two-app research system:
- ✅ MoodScan — collects emotion data while a user watches a video
- 🔎 MoodScanAnalyzer — analyzes whether the expected emotions were met (per scene and overall)
➡️ MoodScan repository: https://github.com/gosiula/MoodScan
- 📈 Visualizes viewer emotions over time on an interactive chart
- 👥 Compares multiple users (with selection limits for readability)
- 🎭 Displays expected emotion segments (assumptions) over the timeline
- ✅ Calculates overall effectiveness (how often assumptions were met)
- 🎬 Calculates per-scene / per-segment effectiveness while the video plays (dynamic segment accuracy)
- 🧾 Loads video metadata and expected emotions from
VideoLabels.csv - 🔍 Works directly on CSV logs generated by MoodScan
MoodScanAnalyzer assumes the same fixed set of 7 emotion labels used by MoodScan:
- 😀
happy - 😢
sad - 😡
angry - 😮
surprised - 😕
confused - 😐
neutral - 😨
scared
Only these values should be used in VideoLabels.csv.
Your folder layout must look like this:
Desktop/
├─ MoodScan/ <-- your cloned repo (the project)
└─ Video/ <-- separate folder next to the project
├─ VideoLabels.csv
└─ Video/
└─ video.mp4
So the video file path will be: Desktop/Video/Video/wideo.mp4
And the CSV file path will be: Desktop/Video/VideoLabels.csv
Inside the MoodScanAnalyzer project directory, in the Users/ folder, add user subfolders like:
MoodScanAnalyzer/
└─ Users/
├─ User1/
│ └─ <log>.csv
├─ User2/
│ └─ <log>.csv
└─ User3/
└─ <log>.csv
Each UserX folder must contain a CSV file generated by MoodScan (the emotion log exported while watching the video).
✅ You can add as many users as you want (User4, User5, …).
✅ One CSV per user folder is expected (the app reads the first *.csv it finds).
✅ Make sure that in Visual Studio each user CSV file has Build Action = Content and Copy to Output Directory = Copy if newer so it gets copied to the app’s output folder.
A sample user log is already included in Users/User1.
Create this file: Desktop/Video/VideoLabels.csv
Use semicolon (;) as the separator.
Required headers: VideoFilePath;PredictedEmotions;Length
Example row: Video/video.mp4;happy(31.00-40.00), surprised(31.00-40.00), happy(50.00-75.00);179,44
Relative path from the outer Video/ folder, e.g.:
Video/video.mp4
A comma-separated list of expectations in the form: emotion(start-end)
Example:
happy(31.00-40.00)
✅ If two or more emotions share the same time range, it means any one of them is acceptable for that segment
(e.g., happy(31.00-40.00), surprised(31.00-40.00) → showing either emotion satisfies the assumption).
Video duration in seconds, e.g. 179,44.
- 🪟 Windows
- 🧠 Visual Studio (recommended)
- ⚙️ .NET (the version used by your solution)
- Clone the repository
- Create the required folder structure:
Desktop/Video/VideoLabels.csvDesktop/Video/Video/<your_video>.mp4
- Add user logs generated by MoodScan:
MoodScanAnalyzer/Users/User1/<log>.csvMoodScanAnalyzer/Users/User2/<log>.csv- etc.
- Open the solution in Visual Studio
- Run the project
MoodScanAnalyzer compares expected emotion segments (from VideoLabels.csv) vs. actual user emotions over time (from MoodScan logs). It then computes overall match score for the video and per-segment match score (scene-by-scene).
To collects the emotion logs, use:
➡️ MoodScan: https://github.com/gosiula/MoodScan
Copyright (c) 2026 Małgorzata Skowron. All rights reserved.
Permission is granted to use, copy, modify, and distribute this software for noncommercial purposes only, provided that this notice is included in all copies.
Commercial use is not permitted without prior written permission from the author. For commercial licensing, please contact the author.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY.