Monday 15 April 2013

c++ - Detecting difference between 2 images -


कृपया नीचे दिए गए कोड को देखें

  #include & lt; iostream & gt; #include & lt; opencv2 / core / core.hpp & gt; #include & lt; स्ट्रिंग & gt; #include & lt; opencv2 / imgproc / imgproc.hpp & gt; #include & lt; opencv2 / highgui / highgui.hpp & gt; #include & lt; opencv2 / imgproc / imgproc.hpp & gt; #include & lt; opencv2 / video / background_segm.hpp & gt; नेमस्पेस एसटीडी का उपयोग करना; नामस्थान cv का उपयोग करना; Int main () {Mat वर्तमान, वर्तमानग्रे, अगला, abs; वीडियो कैप्चर कैम 1, सीएम 2; Std :: vector & lt; vector & lt; प्वाइंट & gt; & gt; contours; वेक्टर के & lt; वेक्टर & LT; प्वाइंट & gt; & gt; contoursPoly (contours.size ()); cam1.open (0); cam2.open (0); namedWindow ( "सामान्य"); namedWindow ( "अंतर"); अगर (! Cam1.isOpened ()) {cout & lt; & lt; "कैम नहीं मिला" & lt; & lt; endl; वापसी -1; } जबकि (सच) {// इनपुट cam1 & gt; & gt; वर्तमान; CurrentGrey = चालू; Cam2 & gt; & gt; आगामी; // भूरे रंग के cvtColor (चालूग्रे, वर्तमानग्रे, सीवी_आरजीबी 2GRAY) में परिवर्तित करें; cvtColor (अगले, अगले, CV_RGB2GRAY); // कम शोर सीवी :: गौसियन बल्लूर (चालूग्रे, वर्तमानग्रे, आकार (0,0), 4); सीवी :: GaussianBlur (अगले, अगले, आकार (0,0), 4); imshow ( "सामान्य", currentGrey); // निरपेक्ष अंतर absdiff प्राप्त करें (वर्तमानग्रे, अगला, abs); imshow ( "अंतर", पेट); के लिए (इंट आई = 0; आई & lt; abs.rows; i ++) {के लिए (इंट जे = 0; जे एंड एलटी; एबकॉल; जे ++) {अगर (एबीएट एंड एलटी; एट एंड जी; (जे, आई) & gt; 0) { Cout & lt; & lt; "डिटेक्टेड बदलें" & lt; & lt; endl; J = abs.cols + 1; मैं = abs.rows + 1; }}} अगर (प्रतीक्षा के (30) & gt; = 0) {ब्रेक; }}}   

यहां पर, जो मैं करने की कोशिश कर रहा हूं वह संदेश प्रिंट करता है जब भी छवियों के बीच का अंतर मिल जाता है। निम्नलिखित भाग तकनीक है

  के लिए (int i = 0; i & lt; abs.rows; i ++) {for (int j = 0; j & lt; abs.cols; j ++) {if (abs .at & lt; int & gt; (जे, आई) & gt; 0) {cout & lt; & lt; "डिटेक्टेड बदलें" & lt; & lt; endl; J = abs.cols + 1; मैं = abs.rows + 1; }}}   

दुर्भाग्य से, संदेशों को छपाई के बजाय जब अंतर का पता लगाया जाता है, तो यह हमेशा संदेश को प्रिंट करता है ऐसा क्यों है? कृपया मदद करें।

आपको दो फ्रेम के बीच की औसत वर्ग त्रुटि की गणना करनी चाहिए।

  एमएसई = योग ((फ्रेम 1-फ्रेम 2) ^ 2) / नंबर   

इसमें गणना करने का एक उदाहरण है

उस कोड के आधार पर आप

  डबल getMSE (कॉन्स्ट) कर सकते हैं मट और आई 1, कॉन्स्ट मेट एंड आई 2) {मट एस 1; Absdiff (I1, I2, s1); // | I1 - I2 | S1.convertTo (s1, CV_32F); // 8 बिट्स s1 = s1.mul (s1) पर कोई वर्ग नहीं बना सकता; // | I1 - I2 | ^ 2 स्केलर s = sum (s1); // प्रति योग प्रति चैनल डबल sse = s.val [0] + s.val [1] + s.val [2]; // योग के जरिये यदि लघु मूल्यों के लिए (एसएसई और एलटी; = 1 ई -10) // शून्य वापसी 0; अन्य {डबल एमएसई = एसएसई / (डबल) (I1.channels () * I1.total ()); वापसी एमएसई; // एमएसई लौटने के बजाय, ट्यूटोरियल कोड वापस PSNR (नीचे) // डबल psnr = 10.0 * log10 ((255 * 255) / एमएसई); // वापसी psnr; }}   

आप इसे अपने कोड में इस तरह से उपयोग कर सकते हैं:

  अगर (getMSE (वर्तमानग्रे, अगला) & gt; some_threshold) cout & lt; & lt; "डिटेक्टेड बदलें" & lt; & lt; endl;   

यह एमएसई के परिमाण को तय करने के लिए आपके ऊपर है, जिससे आप छवियों को समान मानते हैं। इसके अलावा आपको शोर को कम करने के लिए गौसीयनब्लूर () के साथ प्रीफिल्टर करना चाहिए, जैसा कि आप पहले से ही करते हैं @fatih_k द्वारा सुझाए गए धुंधला विधि नहीं एक गाऊसी फिल्टर है; यह एक बॉक्स फिल्टर है और यद्यपि अधिकतर कलाकृतियों का परिचय दे सकता है।

No comments:

Post a Comment