मेरे पास मॉडल छवि पर ऑब्जेक्ट है। मैं मॉडल छवि पर ऑब्जेक्ट और लक्ष्य छवि पर ऑब्जेक्ट के बीच रूपांतरण (विस्थापन, स्केल, रोटेशन) की गणना करना चाहता हूं। मैं धारणा बनाना चाहता हूं कि वस्तु को 2 डी के रूप में माना जा सकता है, इसलिए केवल 2 डी परिवर्तनों की गणना की जानी चाहिए।अंक के दो सेट के बीच परिवर्तन
सबसे पहले मैं मैन्युअल रूप से सहायता प्राप्त करना चाहता हूं। उपयोगकर्ता मॉडल छवि पर आधार बिंदु का चयन करता है और फिर लक्षित छवि पर लक्ष्य बिंदु का चयन करता है। अंक की संख्या उपयोगकर्ता द्वारा परिभाषित की जानी चाहिए (लेकिन कम से कम 2-3 अंक से कम नहीं)। जब अंक अलग-अलग जानकारी देते हैं, तो परिवर्तन औसत होना चाहिए और उदाहरण के लिए मिलान की गुणवत्ता की गणना की जा सकती है।
तो प्रश्न बिंदुओं के दो सेटों के रूपांतरण की गणना करने के बजाए हैं, लेकिन जैसा कि मैं इसे छवि पर करना चाहता हूं, मैंने छवि प्रसंस्करण टैग जोड़ा है।
विशेष रूप से स्वागत है कोड या छद्म कोड के कुछ टुकड़ों के साथ संदर्भ और सलाह हैं।
दो बिंदुओं के साथ यह बहुत आसान मुद्दा है, केवल घूर्णन, स्केल और लाइन के विस्थापन को लिया जाना चाहिए, लेकिन इसे और अधिक अंक के साथ कैसे करना है, और औसत के साथ और कुछ गुणवत्ता कारकों की गणना करना।
वर्तमान समाधान है:
void transformFnc(std::vector<PointF> basePoints, std::vector<PointF> targetPoints,
PointF& offset, double rotation, double scale)
{
std::vector<Line> basePointsLines;
std::vector<Line> targetPointsLines;
assert(basePoints.size() == targetPoints.size());
int pointsNumber = basePoints.size();
for(int i = 0; i < pointsNumber; i++)
{
for(int j = i + 1; j < pointsNumber; j++)
{
basePointsLines.push_back(Line(basePoints[i], basePoints[j]));
targetPointsLines.push_back(Line(targetPoints[i], targetPoints[j]));
}
}
std::vector<double> scalesVector;
std::vector<double> rotationsVector;
double baseCenterX = 0, baseCenterY = 0, targetCenterX = 0, targetCenterY = 0;
for(std::vector<Line>::iterator it = basePointsLines.begin(), i = targetPointsLines.begin();
it != basePointsLines.end(), i != targetPointsLines.end(); it++, i++)
{
scalesVector.push_back((*i).length()/(*it).length());
baseCenterX += (*it).pointAt(0.5).x();
baseCenterY += (*it).pointAt(0.5).y();
targetCenterX += (*i).pointAt(0.5).x();
targetCenterY += (*i).pointAt(0.5).y();
double rotation;
rotation = (*i).angleTo((*it));
rotationsVector.push_back(rotation);
}
baseCenterX = baseCenterX/pointsNumber;
baseCenterY = baseCenterY/pointsNumber;
targetCenterX = targetCenterX/pointsNumber;
targetCenterY = targetCenterY/pointsNumber;
offset = PointF(targetCenterX - baseCenterX, targetCenterY - baseCenterY);
scale = sum(scalesVector)/scalesVector.size();
rotation = sum(rotationsVector)/rotationsVector.size();
}
केवल अनुकूलन मैं इस कोड में पा सकते हैं तराजू और रोटेशन उन मूल्यों को जो बाकी हिस्सों से बहुत ज्यादा अलग से खत्म करने के लिए है।
मैं समाधान प्रस्तावों के कोड या छद्म कोड की तलाश में हूं। यह कुछ कोडों के संदर्भ भी हो सकता है।
तो जवाब से जहाँ तक मुझे पता है कि:
- RANSAC एल्गोरिथ्म इस्तेमाल किया जा सकता
- मैं कम से कम वर्ग भावना
क्या आप अन्य परिवर्तनों को खींचना और कतरन करना चाहते हैं? –
नहीं। धारणा यह है कि यह ठोस वस्तु है। कोई परिप्रेक्ष्य, खींचने, कताई। – krzych
संभावित डुप्लिकेट [एक त्रिकोण को दूसरे त्रिकोण में बदलें] (http://stackoverflow.com/questions/1114257/transform-a-triangle-to-another-triangle) – finnw