2014-06-12 6 views
8

के अंदर कोड मैं अपनी त्वचा के वीडियो से दिल की दर खोजने की कोशिश कर रहा हूं। ऐसा करने के लिए, मैं अपने वीडियो फ्रेम से पिक्सल का एक फसल आयताकार ले रहा हूं और उन सभी पिक्सेल में लाल (या हरा) घटक औसत (फिर, यह देखकर, यह औसत फ्रेम-टू-फ्रेम कैसे बदलता है)।सरल वीडियो से दिल की दर प्राप्त करना:

मैं वेक्टर (प्रत्येक फ्रेम के फसल वाले अनुभाग का औसत रंग मान) का तेज़ चौकोर परिवर्तन लेता हूं ताकि यह देखने के लिए कि आवृत्तियों सबसे प्रमुख हैं। मैं आशा करता हूं कि बाकी मानव हृदय गति, ~ 1 हर्ट्ज, बहुत प्रमुख के रूप में।

एक परीक्षण के रूप में, मैंने केवल एक दीवार, या अन्य वस्तुओं का एक वीडियो लिया जिसमें कोई आवधिक रंग परिवर्तन नहीं होना चाहिए। मैंने एक तिपाई और विभिन्न ब्रांडों के तीन अलग-अलग कैमरे का इस्तेमाल किया। उनमें से प्रत्येक समान है यदि समान पृष्ठभूमि आवृत्ति चोटियों विशेष रूप से 1 हर्ट्ज, 2 हर्ट्ज, 5 हर्ट्ज, और 10 हर्ट्ज पर नहीं है। मैंने प्राकृतिक प्रकाश और फ्लोरोसेंट के तहत गोली मार दी है और यह अभी भी होती है।

मेरा अंतिम लक्ष्य इस विश्लेषण के साथ, गैर-संवहनीकृत त्वचा से त्वचा को अलग करना है। तो समझ में क्यों मुझे निर्जीव वस्तुओं के लिए इन आवृत्ति चोटियों को मिल रहा है विटाल है।

क्या आप में से कोई भी इस कोड को अपने वीडियो पर चला सकता है और यह समझाने में सहायता कर सकता है कि मैं बस मूर्ख हूं?

कैमरा शूटिंग:

कोडक Playsport

1920x1080 30fps (60i) mp4 के रूप में आयात

कैनन VIXIA HF200 1440x1080 30fps (60i) .mts के रूप में 12Mbps बिटरेट आयात जो मैं mp4

कोड के आधार पर पुन: कोड:

http://www.ignaciomellado.es/blog/Measuring-heart-rate-with-a-smartphone-camera#video

clear all 
close all 
clc 

%% pick data file name to be analyzed, set directory it is found in 
dataDir = './data'; 
vidname = ['Filename.MP4']; 

%% define path to file and pull out video 
inFile = fullfile(dataDir,vidname); 
video = VideoReader(inFile); 

%% make 1D array with length equal to number of frames (time) 

brightness = zeros(1, video.NumberOfFrames); 
video_framerate = round(video.FrameRate); % note some places in the code must use integer value for framerate, others we directly use the unrounded frame rate 

%% set region of interest for what you want to get average brightness of 
frame = read(video, 1); 
imshow(frame) 
rect = getrect; 
close all 

xmin_pt = round(rect(1)); 
ymin_pt = round(rect(2)); 
section_width = round(rect(3)); 
section_height = round(rect(4)); 

%% select component of video (red green or blue) 
component_selection = 1; % pick red , green, or blue 

%% make 1D array of ROI averages 
for i = 1:video.NumberOfFrames, 
    frame = read(video, i); 
    section_of_interest = frame(ymin_pt:ymin_pt+section_height,xmin_pt:xmin_pt+section_width,:); 
    colorPlane = section_of_interest(:, :, component_selection); 
    brightness(i) = sum(sum(colorPlane))/(size(frame, 1) * size(frame, 2)); 
end 


%% Filter out non-physiological frequencies 
BPM_L = 40; % Heart rate lower limit [bpm] 
BPM_H = 600; % Heart rate higher limit [bpm] This is currently set high to investigate the signal 

% Butterworth frequencies must be in [0, 1], where 1 corresponds to half the sampling rate 
[b, a] = butter(2, [((BPM_L/60)/video_framerate * 2), ((BPM_H/60)/video_framerate * 2)]); 
filtBrightness = filter(b, a, brightness); 


%% Trim the video to exlude the time where the camera is stabilizing 
FILTER_STABILIZATION_TIME = 3; % [seconds] 
filtBrightness = filtBrightness((video_framerate * FILTER_STABILIZATION_TIME + 1):size(filtBrightness, 2)); 

%% Do FFT on filtered/trimmed signal 
fftMagnitude = abs(fft(filtBrightness)); 

%% Plot results 

figure(1) 
subplot(3,1,1) 
plot([1:length(brightness)]/video.FrameRate,brightness) 
xlabel('Time (seconds)') 
ylabel('Color intensity') 
title('original signal') 

subplot(3,1,2) 
plot([1:length(filtBrightness)]/video.FrameRate,filtBrightness) 
xlabel('Time (seconds)') 
ylabel('Color intensity') 
title('after butterworth filter and trim') 


freq_dimension = ((1:round(length(filtBrightness)))-1)*(video_framerate/length(filtBrightness)); 

subplot(3,1,3) 
plot(freq_dimension,fftMagnitude) 
axis([0,15,-inf,inf]) 
xlabel('Frequency (Hz)') 
ylabel('|Y(f)|') 
title('Fft of filtered signal') 
+0

क्या आपके पास फ्लोरोसेंट प्रकाश है जो ~ 60 हर्ट्ज पर झिलमिलाहट करता है? या जो भी एसी आवृत्ति आपके लोकेल पर है? या किसी टीवी या कुछ रीफ्रेश दर के साथ कुछ और प्रतिबिंब बनाने (जैसे आपकी आंखों के लिए दृश्यमान नहीं) की तरह कुछ और? – twalberg

+0

मैंने प्राकृतिक प्रकाश (बाहरी) और कार्यालय में जहां फ्लोरोसेंट हैं, दोनों के तहत प्रयास किया। 60 हर्ट्ज बहुत तेज़ है। मैं 1, 2, 5, और 10 हर्ट्ज घटकों को समझ नहीं पा रहा हूं जो मेरे सभी संकेतों में पॉप-अप होने लगते हैं। ऐसा लगता है कि मैं कुछ उपयोग कर रहा हूं या कर रहा हूं लेकिन मुझे यकीन नहीं है। उम्मीद कर रहा था कि किसी ने पहले यह अनुभव किया होगा या वीडियो होगा, वे खुद को चला सकते हैं। – user3734804

+0

मैं उस चीज के साथ हस्तक्षेप बीट्स सोच रहा था जो आपके करीब 30 एफपीएस फ्रेम दर (जो कि 30 हर्ट्ज से शुरू हो सकता है या नहीं हो सकता है) के बराबर है। यह आवृत्ति डोमेन में कुछ प्रमुख फ्रीक्वेंसी घटकों के साथ दिखाई देगा ... – twalberg

उत्तर

1

आपका उद्देश्य "मेरी त्वचा के एक वीडियो से एक दिल की दर को खोजने के लिए" और "... इस विश्लेषण के साथ, भेद करने के लिए, गैर vascularized त्वचा से त्वचा की जीवित" लेकिन अपने है दृष्टिकोण "वीडियो ले लो ... फसल ... औसत लाल (या हरा) घटक .. देखो यह कैसे बदलता है"।

मुझे लगता है कि आधार के साथ कोई समस्या है। औसत का मतलब है कि बहुमत संकेत पर हावी है। मानव दृष्टि दृश्य डेटा का एक (अद्भुत) प्रोसेसर है और आमतौर पर मशीनों को उनके द्वारा किए जाने वाले छोटे आदेश के भीतर आने के लिए कठिन परिश्रम लगता है। यदि आप अपने आस-पास के 90% लोगों पर अपनी आंखों को नहीं देख सकते हैं और उनके दिल की दर को माप सकते हैं, तो एक औसत दृष्टिकोण जाने का रास्ता नहीं हो सकता है।

समय के साथ वितरण में परिवर्तन कैसे होता है, यह देखने के लिए आप कितने आंकड़े ले सकते हैं, और इसका मतलब केवल उनमें से एक है। यदि आप केवल मतलब पर देखते हैं तो आप जानकारी खो सकते हैं।

मैं यह करने के हैं कैसे:

  1. मैं फ्रेम करने के लिए फ्रेम मतभेद पर कार्य करते हैं।
  2. अधिकांश वीडियो कोडेक्स में गैर-वर्दी टाइम-स्पेसिंग होता है। मैं उन मानों को प्राप्त करूंगा ताकि मैं वास्तविक (अनुमानित नहीं) समय पर परिवर्तनों को ट्रैक कर सकूं। आपके वर्तमान (संभावित रूप से झूठे) संकेत CODEC के साथ-साथ हार्डवेयर से भी आ सकते हैं।
  3. मैं ऐसी फिल्म बनाउंगा कि प्रत्येक नया फ्रेम इसके और पिछले फ्रेम के बीच का अंतर है। मैं इसे 20 बार देखता हूं और देखता हूं कि मेरी (अद्भुत) मानव दृश्य प्रसंस्करण प्रणाली कुछ हद तक दिल से हरा-संबंधित या स्पष्ट रूप से नहीं देख सकती है।
  4. "नहीं" के लिए उन्हें प्रसंस्करण से हटाएं, मास्क, फ़िल्टर या ऐसे द्वारा। संबंधित के लिए, उन्हें द्वारा अन्य सभी चीज़ों को हटाने, पिक्सेल तीव्रता हिस्टोग्राम को छिड़काव करने, या अन्य छवि संवर्द्धन (धुंधला, तेज, पुनः रंग, किनारे, घुमाएं ताकि सबसे बड़ा सिग्नल अद्यतन पिक्सेल अक्ष के साथ हो, और फिर प्रक्रिया ..)

मानव दृष्टि तंत्र के बाद एक अच्छा सिग्नल प्राप्त हो सकता है, तो मैं गणित/कंप्यूटर को स्पष्ट ज्ञान के साथ सिग्नल प्राप्त करने के लिए काम करता हूं कि मानव तंत्र बेहतर है।

यदि मैं समय के साथ आगे बढ़ने वाले बिंदुओं/सुविधाओं को ट्रैक कर रहा था, तो मैं उप-पिक्सेल मेट्रोलॉजी विधियों को देखता हूं। मैंने इनमें से कुछ दशक पहले (thesis) किया था और जब मुझे लगता है कि सामग्री प्रासंगिक हो सकती है, तो यह कोड कॉपी करने और चलाने से पहले पहले पढ़ने-पढ़ने की योग्यता के लिए भी अलग हो सकता है।

शुभकामनाएं।

संबंधित मुद्दे