Red de conocimiento informático - Conocimiento sistemático - P: El código de implementación específico o incluso el pseudocódigo de la función cvMinAreaRect2 en openCV.

P: El código de implementación específico o incluso el pseudocódigo de la función cvMinAreaRect2 en openCV.

Referencias:

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