हम वास्तव में एक छवि विश्लेषण प्रोजेक्ट पर काम कर रहे हैं जहां हमें एक दृश्य में गायब/प्रकट वस्तुओं की पहचान करने की आवश्यकता है। यहां 2 छवियां हैं, एक सर्जन द्वारा और बाद में एक क्रिया के पहले एक कब्जा कर लिया गया है।ऑप्टिकल प्रवाह स्पैर मोशन को अनदेखा करता है
सबसे पहले, हम सिर्फ 2 छवियों के बीच अंतर की गणना और यहाँ नतीजा है (ध्यान दें कि मैं परिणाम Mat
को 128 जोड़ा सिर्फ एक अच्छे छवि के लिए) :
लक्ष्य का पता लगाने के लिए कि कप (लाल तीर) SCE से गायब हो गया है ने और सिरिंज (काला तीर) दृश्य में प्रवेश कर चुका है, दूसरे शब्दों से हमें केवल उन क्षेत्रों का पता लगाना चाहिए जो दृश्य में बाएं/दर्ज वस्तुओं से मेल खाते हैं। साथ ही, यह स्पष्ट है कि दृश्य के ऊपरी बाईं ओर वाली वस्तुओं को अपनी प्रारंभिक स्थिति से थोड़ा सा स्थानांतरित कर दिया गया है। मैंने सोचा था कि Optical flow
के बारे में तो मैं OpenCV C++
इस्तेमाल किया क्रम में Farneback की एक गणना करने के लिए कि क्या यह हमारे मामले के लिए काफी है और यहाँ है परिणाम हमारे पास देखने के लिए, कोड हम लिखा था, जिसके बाद:
void drawOptFlowMap(const Mat& flow, Mat& cflowmap, int step, double, const Scalar& color)
{
cout << flow.channels() << "/" << flow.rows << "/" << flow.cols << endl;
for(int y = 0; y < cflowmap.rows; y += step)
for(int x = 0; x < cflowmap.cols; x += step)
{
const Point2f& fxy = flow.at<Point2f>(y, x);
line(cflowmap, Point(x,y), Point(cvRound(x+fxy.x), cvRound(y+fxy.y)), color);
circle(cflowmap, Point(x,y), 1, color, -1);
}
}
void MainProcessorTrackingObjects::diffBetweenImagesToTestTrackObject(string pathOfImageCaptured, string pathOfImagesAfterOneAction, string pathOfResultsFolder)
{
//Preprocessing step...
string pathOfImageBefore = StringUtils::concat(pathOfImageCaptured, imageCapturedFileName);
string pathOfImageAfter = StringUtils::concat(pathOfImagesAfterOneAction, *it);
Mat imageBefore = imread(pathOfImageBefore);
Mat imageAfter = imread(pathOfImageAfter);
Mat imageResult = (imageAfter - imageBefore) + 128;
// absdiff(imageAfter, imageBefore, imageResult);
string imageResultPath = StringUtils::stringFormat("%s%s-color.png",pathOfResultsFolder.c_str(), fileNameWithoutFrameIndex.c_str());
imwrite(imageResultPath, imageResult);
Mat imageBeforeGray, imageAfterGray;
cvtColor(imageBefore, imageBeforeGray, CV_RGB2GRAY);
cvtColor(imageAfter, imageAfterGray, CV_RGB2GRAY);
Mat imageResultGray = (imageAfterGray - imageBeforeGray) + 128;
// absdiff(imageAfterGray, imageBeforeGray, imageResultGray);
string imageResultGrayPath = StringUtils::stringFormat("%s%s-gray.png",pathOfResultsFolder.c_str(), fileNameWithoutFrameIndex.c_str());
imwrite(imageResultGrayPath, imageResultGray);
//*** Compute FarneBack optical flow
Mat opticalFlow;
calcOpticalFlowFarneback(imageBeforeGray, imageAfterGray, opticalFlow, 0.5, 3, 15, 3, 5, 1.2, 0);
drawOptFlowMap(opticalFlow, imageBefore, 5, 1.5, Scalar(0, 255, 255));
string flowPath = StringUtils::stringFormat("%s%s-flow.png",pathOfResultsFolder.c_str(), fileNameWithoutFrameIndex.c_str());
imwrite(flowPath, imageBefore);
break;
}
//Reference method just to see the accuracy of the optical flow calculation
Mat accuracy = Mat::zeros(imageBeforeGray.rows, imageBeforeGray.cols, imageBeforeGray.type());
strinfor(int y = 0; y < imageAfter.rows; y ++)
for(int x = 0; x < imageAfter.cols; x ++)
{
Point2f& fxy = opticalFlow.at<Point2f>(y, x);
uchar intensityPointCalculated = imageAfterGray.at<uchar>(cvRound(y+fxy.y), cvRound(x+fxy.x));
uchar intensityPointBefore = imageBeforeGray.at<uchar>(y,x);
uchar intensityResult = ((intensityPointCalculated - intensityPointBefore)/2) + 128;
accuracy.at<uchar>(y, x) = intensityResult;
}
validationPixelBased = StringUtils::stringFormat("%s%s-validationPixelBased.png",pathOfResultsFolder.c_str(), fileNameWithoutFrameIndex.c_str());
imwrite(validationPixelBased, accuracy);
टी होने के इरादे: IMAGEBEFORE -
और पता करने के लिए कितना सही इस ऑप्टिकल प्रवाह है, मैं कोड के इस छोटे से टुकड़े की गणना (IMAGEAFTER + फ्लो) ने लिखा है उसकी ((intensityPointCalculated - intensityPointBefore)/2) + 128;
सिर्फ एक समझदार छवि है।
छवि परिणाम:
के बाद से यह सभी क्षेत्रों कि स्थानांतरित कर दिया गया है का पता लगाता है/दर्ज/दृश्य छोड़ दिया है, हमें लगता है कि OpticalFlow
सिर्फ क्षेत्रों वस्तुओं का प्रतिनिधित्व गायब हो गया पता लगाने के लिए पर्याप्त नहीं है/दृश्य में दिखाई दिया। opticalFlow
द्वारा पता लगाए गए स्पैर मोशन को अनदेखा करने का कोई तरीका है? या क्या हमें पता लगाने के लिए कोई वैकल्पिक तरीका है?
मैं पुन: पेश करने में सक्षम नहीं कर रहा हूँ वही परिणाम .. क्या आप कृपया मुझे उन मूल्यों को बता सकते हैं जिनका उपयोग आप इन स्थिरांकों के लिए कर रहे हैं: BLUR_SIZE, ERROR_THRESHOLD, MASK_THRESHOLD – Maystro
के आधार पर 960 x 540 इनपुट छवि, मेरे पास BLUR_SIZE = 35, ERROR_THRESHOLD = 30, MASK_THRESHOLD = 1.5 था। आप स्पैस ऑप्टिकल फ्लो पिरामिड लेवल, पैच साइज इत्यादि जैसे अन्य पैरा को भी ट्विक करना चाहेंगे। हालांकि सभी स्थिर परिस्थितियों में सरल निरंतर थ्रेसहोल्डिंग अच्छी तरह से काम नहीं कर सकती है और आप अपने उपयोग के मामलों के आधार पर अधिक परिष्कृत रणनीतियों को लागू करना चाहेंगे। – myin528
आपके समर्थन के लिए धन्यवाद। आपके उत्तर में मेरे ज्यादातर मामलों को शामिल नहीं किया गया है, लेकिन मैं आपको पर्याप्त राशि के बाद से बक्षीस दूंगा। – Maystro