P: El código de implementación específico o incluso el pseudocódigo de la función cvMinAreaRect2 en openCV.
http://fossies. org/DOX/OpenCV-2. 4. 4 a/rot calipers _ 8 CPP _ html.
Lo siguiente es un extracto de Starts. en la línea 347.
347?CV_IMPLCvBox2D
348?cvMinAreaRect2(?const?CvArr*?Array,?CvMemStorage*?Storage?)
349?{
350?cv::Ptr<CvMemStorage>? Almacenamiento temporal;
351?CvBox2D? caja;
352?cv::AutoBuffer<CvPoint2D32f>? _puntos;
353?CvPoint2D32f*? puntos;
354?
355?memset(& box,?0,?sizeof(box));
356?
357?int? I,? n;
358?CvSeqReader? Lector;
359?CvContour? Contour_Header;
360?CvSeqBlock? Escudo;
361?CvSeq*? ¿ptseq? =?(CvSeq*)array;
362?CvPoint2D32f? fuera[3];
363?
364?if(?CV_IS_SEQ(ptseq)?)
365?{
366 ?if(?! CV_IS_SEQ_POINT_SET(ptseq)?& amp& amp
367?(CV_SEQ_KIND(ptseq)?!=?CV_SEQ_KIND_CURVE?||
368?CV_SEQ_ELTYPE(ptseq)? = ?CV_SEQ_ELTYPE_PPOINT? ))
369?CV_StsUnsupportedFormat,
370?"¿Entrada? ¿Secuencia? ¿Requerido? ¿Composición? ¿2d? ¿Puntero? ¿2d?); si (?!) 372? =?pt seq->;Almacenamiento;
373?}
374?Otro
375?{
376?ptseq? =?cvPointSeqFromMat(?CV_SEQ_kind_generic,?array,?&contour_title,?&masked?);
377?}
378?
379?If(?Storage ?)
380?{
381?Almacenamiento temporal? =?cvCreateChildMemStorage(?Almacenamiento?);
382?}
383?Otros
384?{
385?Almacenamiento temporal ? =?cvCreateMemStorage(1?& lt& lt?10);
386?}
387?
388?ptseq? =?cvConvexHull2(?ptseq,?almacenamiento temporal,?cv_clock,?1?);
389?n? =?pt seq->;Total;
390?
391?_ puntos asignar(n);
392?Puntos? =?_points;
393?cvStartReadSeq(?ptseq,?&reader?);
394?
395?if (?CV_SEQ_ELTYPE(? ptseq? ) ?==?CV_32SC2? )
396?{
397?para (?i?=?0;?i?<?n;?i++?)
¿398?{
399?
¿CvPunto? pt;
400?CV_READ_SEQ_ELEM(?pt,?lector?);
401?Puntos[i]. ¿incógnita? =?(flotante)pt x;
402? puntos[i]. ¿y? =?(flotante)pt . y;
403?}
404?}
405?Otro
406?{
407?For (?i?=?0;?i?<?n;?i++?)
408?{
409?CV_READ_SEQ_ELEM( ? Puntos[i],? Lector? );
411?}
413 (?n?& gt?2?)
414?{
415?icv Calibrador giratorio (?min,?n,?CV_Caliper_MINAREARECT,?(float* )out? );
416?box.center.x? =?fuera[0]. ¿incógnita? +?(salida[1].x?+?salida[2].x)* 0.5f;
417?box.center.y? =?fuera[0]. ¿y? +?(salida[1].y?+?salida[2].y)* 0.5f;
418?box.size.width? =?(float)sqrt((doble)salida[1].x*salida[1].x?+?(doble)salida[1].y*salida[1].y);
419?Tamaño.de.la.caja.alto? =?(float)sqrt((doble)salida[2].x*salida[2].x?+?(doble)salida[2].y*salida[2].y);
420?caja. ¿ángulo? =?(float)atan2(?(doble)salida[1].y,?(doble)salida[1].x?);
421?}
422? ¿De lo contrario? if(?n?==?2?)
423?{
424?box.center.x? =?(Puntos[0].x?+?Puntos[1].x)* 0.5f;
425?box.center.y? =?(Punto[0].y?+?Punto[1].y)* 0.5f;
426?Doble? ¿dx? =?Puntos[1]. ¿incógnita? -?Puntos[0]. x;
427? morir? =?Puntos[1]. ¿y? -?Puntos[0]. y;
428?Tamaño.Caja.Ancho? =?(float)sqrt(dx*dx?+?dy * dy);
429?Box.Size.Height? =?0;
430?caja. ¿ángulo? =?(float)atan2(?dy?dx?);
431?}
432?Otros
433?{
434?If(?n?==?1?)
435?box.center? =?Puntos[0];
436?}
437?
438?Box. ¿ángulo? =?(float)(box . ángulo * 180/CV _ PI);
439?Regresión? Caja;
440?}
441