2013-05-03 12 views
5

के लिए मास्क पैरामीटर का उपयोग कैसे करें मैं क्षेत्रों के एक सेट (मास्क) में एक सर्फफेचर डिटेक्टर को सीमित करना चाहता हूं। एक परीक्षण के लिए मैं केवल एक ही मुखौटा परिभाषित:ओपनसीवी: फीचर पॉइंट डिटेक्शन (एसयूआरएफ)

Mat srcImage; //RGB source image 
Mat mask = Mat::zeros(srcImage.size(), srcImage.type()); 
Mat roi(mask, cv::Rect(10,10,100,100)); 
roi = Scalar(255, 255, 255); 
SurfFeatureDetector detector(); 
std::vector<KeyPoint> keypoints; 
detector.detect(srcImage, keypoints, roi); // crash 
//detector.detect(srcImage, keypoints); // does not crash 

जब मैं "रॉय" पारित मुखौटा के रूप में मैं इस त्रुटि मिलती है:

OpenCV Error: Assertion failed (mask.empty() || (mask.type() == CV_8UC1 && mask.size() == image.size())) in detect, file /Users/ux/Downloads/OpenCV-iOS/OpenCV-iOS/../opencv-svn/modules/features2d/src/detectors.cpp, line 63 

इसमें क्या गलत है? मैं SurfFeatureDetector की "पहचान" विधि में एक मुखौटा कैसे सही ढंग से पास कर सकता हूं?

सम्मान,

उत्तर

13

मुखौटा के बारे में दो चीजें।

  • मुखौटा 8 बिट अहस्ताक्षरित वर्ण के 1 चैनल मैट्रिक्स, जो opencv प्रकार CV_8U करने के लिए अनुवाद किया जाना चाहिए। आपके मामले में मुखौटा का प्रकार srcImage.type() है, जो एक 3-चैनल मैट्रिक्स
  • है, आप डिटेक्टर को roi पास कर रहे हैं लेकिन आपको mask गुजरना चाहिए। जब आप roi में परिवर्तन कर रहे हैं, तो आप mask भी बदल रहे हैं।

Mat srcImage; //RGB source image 
Mat mask = Mat::zeros(srcImage.size(), CV_8U); // type of mask is CV_8U 
Mat roi(mask, cv::Rect(10,10,100,100)); 
roi = Scalar(255, 255, 255); 
SurfFeatureDetector detector(); 
std::vector<KeyPoint> keypoints; 
detector.detect(srcImage, keypoints, mask);  // passing `mask` as a parameter 
+1

धन्यवाद, यह काम कर रहा है। – Hyndrix

+0

मुझे लगता है कि यह 'स्केलर (255) होना चाहिए;' मास्क 1-आयामी है। –

+0

'roi' में 3 चैनल हैं, जैसे' srcImage' ('roi'' srcImage' का सबमेट्रिक्स है) – Alexey

1

मैं निम्न परिवर्तन उसमें परिवर्तन के बिना मेरे लिए काम किया

cv::Mat mask = cv::Mat::zeros(frame.size(), CV_8UC1); //NOTE: using the type explicitly 
cv::Mat roi(mask, cv::Rect(10,10,100,100)); 
roi = cv::Scalar(255, 255, 255); 

//SURF feature detection 
const int minHessian = 400; 
cv::SurfFeatureDetector detector(minHessian); 
std::vector<cv::KeyPoint> keypoints; 
detector.detect(frame, keypoints, mask);    //NOTE: using mask here, NOT roi 
cv::Mat img_keypoints; 
drawKeypoints(frame, keypoints, img_keypoints, cv::Scalar::all(-1), cv::DrawMatchesFlags::DEFAULT); 
cv::imshow("input image + Keypoints", img_keypoints); 
cv::waitKey(0); 

के साथ कुछ मौजूदा कोड मैं पर काम कर रहा था पर आपके ROI कोड हमला बोला, निम्नलिखित काम करना चाहिए आपके मास्क के रूप में roi के बजाय mask का प्रकार और उपयोग, मुझे एक रनटाइम त्रुटि भी मिल जाएगी। यह समझ में आता है, क्योंकि पता लगाने का तरीका मास्क चाहता है - यह मूल छवि के समान आकार होना चाहिए, और roi नहीं है (यह 100x100 आयताकार है)। इसे दृष्टि से देखने के लिए, मास्क और roi

cv::imshow("Mask", mask); 
cv::waitKey(0); 

cv::imshow("ROI", roi); 
cv::waitKey(0); 

प्रकार को भी मिलान करना है; मुखौटा, एक चैनल होना चाहिए, जबकि अपनी छवि प्रकार प्रकार 16 है, जो CV_8UC3 के नक्शे, एक ट्रिपल चैनल छवि

0

आप तो अनियमित मुखौटा के लिए एक ही लागू करने के लिए देख रहे हैं की संभावना है:

Mat& obtainIregularROI(Mat& origImag, Point2f topLeft, Point2f topRight, Point2f botLeft, Point2f botRight){ 

     static Mat black(origImag.rows, origImag.cols, origImag.type(), cv::Scalar::all(0)); 
     Mat mask(origImag.rows, origImag.cols, CV_8UC1, cv::Scalar(0)); 
     vector< vector<Point> > co_ordinates; 
     co_ordinates.push_back(vector<Point>()); 
     co_ordinates[0].push_back(topLeft); 
     co_ordinates[0].push_back(botLeft); 
     co_ordinates[0].push_back(botRight); 
     co_ordinates[0].push_back(topRight); 
     drawContours(mask,co_ordinates,0, Scalar(255),CV_FILLED, 8); 

     // origImag.copyTo(black,mask); 
     //BasicAlgo::getInstance()->writeImage(black); 
     return mask; // returning the mask only 
    } 

फिर सामान्य रूप से, SIFT/SURF/उत्पन्न करें ... सूचक

// SIFT सुविधा डिटेक्टर के लिए स्मार्ट पॉइंटर बनाएं।

Ptr<FeatureDetector> SIFT_FeatureDetector = FeatureDetector::create("SIFT"); 
vector<KeyPoint> SIFT_Keypoints; 
vector<KeyPoint> SIFT_KeypointsRotated; 
Mat maskedImg = ImageDeformationOperations::getInstance()->obtainIregularROI(rotatedImg,rotTopLeft,rotTopRight,rotBotLeft,rotBotRight); 
SIFT_FeatureDetector->detect(rotatedImg, SIFT_KeypointsRotated, maskedImg); 
Mat outputSIFTKeyPt; 
drawKeypoints(rotatedImg, SIFT_KeypointsRotated, outputSIFTKeyPt, keypointColor, DrawMatchesFlags::DEFAULT); 
संबंधित मुद्दे