Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found
Select Git revision
  • 104-integrate-unit-and-regression-tests-in-ctest
  • 106-reduce-duplicate-code-with-templates
  • 107-crash-by-using-error-button
  • 108-store-calculated-errors
  • 111-looping-warning
  • 115-pet-file-show-only-people
  • 116-command-line-options
  • 118-get3dpoint-2-methods-implemented-but-only-newer-used
  • 118-get3dpoint-2-methods-implemented-but-only-newer-used-2
  • 122-move-control-gui-tabs-to-separate-files
  • 124-custom-messagebox-with-logging-capabilities-and-offscreen-scripting-support
  • 125-delete-obsolete-markercolor-cpp-h
  • 127-make-cpack-generator-for-windows-a-cache-variable
  • 128-adding-manual-trackpoints-when-showonlypeople-is-on
  • 13-reformat-project-with-clang-format
  • 131-windows-uninstall-leaves-registry-entries
  • 132-add-pedantic-to-compiler-flags
  • 133-refactoring-the-findmulticolormarker-function
  • 139-moving-trackpoint-broken
  • 14-add-clang-tidy
  • 140-height-limitations-on-multicolormarker
  • 142-manual-setting-height-too-restrictive
  • 146-structure-of-the-project
  • 147-reducing-quality-of-wrong-path-not-working-with-color-marker
  • 149-crash-when-holding-next-frame-button-down-too-long
  • 15-fix-warnings
  • 150-optimize-visual-representation-of-skeleton-coming-vfrom-c3d
  • 152-use-not-readable-code-marker-for-fixed-head-position
  • 154-license-header-missing-in-pmessagebox
  • 16-tracker-track-bug
  • 169-crash-in-trackerreal-calculate
  • 172-enlarge-crop-rect-for-arucocodemarker-with-colormarker-detection
  • 176-add-possibility-to-edit-chessboard-properties-to-gui
  • 177-create-recognizer-class
  • 178-add-tests-for-codemarkerwidget
  • 178-create-options-class-for-code-marker
  • 187-use-pointer-approach-for-ui-to-decrease-compile-time
  • 188-raise-warning-level-and-fix-warnings-on-msvc
  • 191-retrack-only-if-whole-path-leading-to-the-current-trackpoint-is-better
  • 192-fix-playback-speed-for-image-sequence
  • 195-support-mutliple-mocap-files
  • 199-wrong-compile-date
  • 20-remove-commented-code
  • 201-allow-selection-of-multiple-mocap-files-in-file-dialog
  • 2021-09-11-mac-installer
  • 20220201-master-backup
  • 205-confidential-issue
  • 209-optimize-multicolormarkerwitharuco_dictmip36h12-test-case
  • 210-make-minmarkerperimeter-and-maxmarkerperimeter-user-configured-for-multi-aruco
  • 213-add-more-intrinsic-calibration-parameters
  • 213-add-more-intrinsic-calibration-parameters-2
  • 216-add-utility-script-for-comparison-of-regression-test-data
  • 220-petrack-crashes-on-cvtcolor
  • 222-mocap-time-offset-is-changed-when-read-in
  • 223-refactor-personstorage-out-of-tracker
  • 224-create-autosave-class-and-mechanism
  • 227-add-script-which-checks-if-license-header-is-added-to-new-source-files
  • 228-create-intrinisc-calibration-project-from-command-line
  • 229-change-to-new-connect-syntax
  • 231-change-mocap-dialog-to-same-style-as-rest
  • 236-show-current-point
  • 240-lk-optical-flow
  • 242-only_people_nr_list-saved-wrong-in-pet-file
  • 243-mocap-management-dialog-improve-usability
  • 246-save-video-as-mp4-quick
  • 247-flickering-of-the-trajectory-overlay
  • 250-saving-pet-file-changes-values
  • 251-follow-up-from-resolve-add-more-intrinsic-calibration-parameters
  • 253-intrinsic-calibration-from-video
  • 259-saving-trc-files-after-opening-a-new-project
  • 269-make-shortcut-export
  • 274-merge-doesn-t-delete-already-merged-person-from-further-evaluation
  • 279-ask-if-intrinsic-calibration-should-be-changed-when-trajectory-already-present
  • 283-make-sure-that-the-offscreen-plugin-is-also-included-in-windows-installer
  • 284-check-frame-number-of-loaded-trc-files
  • 291-move-to-frame
  • 293-correct-move-trackpoint-along-visible-trajectory
  • 296-fix-warning-on-msvc
  • 299-correct-tab-order
  • 302-disable-scrolling-in-spinboxes-when-not-desired
  • 303-tooltip-chessboard-properties
  • 305-intrinsic-calibration-switch-between-models
  • 315-crash-when-using-5-calibration-points-for-extrinsic-calibration
  • 316-ext-model-always-enabled
  • 317-case-sensitivity-on-file-endings
  • 321-version-in-pet-file-not-always-major-minor-patch
  • 322-empty-lines-in-the-height-file
  • 328-alt-doubleclickleft-also-triggers-alt-clickleft
  • 328-alt-doubleclickleft-also-triggers-alt-clickleft-2
  • 329-make-sure-that-every-slider-also-gets-a-spinbox
  • 330-remove-non-const-global-pointer-to-control
  • 332-setting-playback-speed-influences-exported-framerate-in-trajectory-files
  • 333-make-slider-only-scrollable-when-clicking-on-them
  • 333-make-slider-only-scrollable-when-clicking-on-them-2
  • 338-greyscale-image-sequence-not-visable
  • 34-check-includes
  • 345-make-change-between-different-intrinsic-calibration-without-losing-trackpoints
  • 348-autosave-popup-when-starting-without-project
  • 349-extensibility-of-trackpoint
  • 353-check-whether-mprofile-is-a-directory
  • CroMa
  • v0.10
  • v0.8
  • v0.9
  • v1.0
105 results

Target

Select target project
  • ped-dyn-emp/petrack
1 result
Select Git revision
  • 104-integrate-unit-and-regression-tests-in-ctest
  • 106-reduce-duplicate-code-with-templates
  • 107-crash-by-using-error-button
  • 108-store-calculated-errors
  • 111-looping-warning
  • 115-pet-file-show-only-people
  • 116-command-line-options
  • 118-get3dpoint-2-methods-implemented-but-only-newer-used
  • 118-get3dpoint-2-methods-implemented-but-only-newer-used-2
  • 122-move-control-gui-tabs-to-separate-files
  • 124-custom-messagebox-with-logging-capabilities-and-offscreen-scripting-support
  • 125-delete-obsolete-markercolor-cpp-h
  • 127-make-cpack-generator-for-windows-a-cache-variable
  • 128-adding-manual-trackpoints-when-showonlypeople-is-on
  • 13-reformat-project-with-clang-format
  • 131-windows-uninstall-leaves-registry-entries
  • 132-add-pedantic-to-compiler-flags
  • 133-refactoring-the-findmulticolormarker-function
  • 139-moving-trackpoint-broken
  • 14-add-clang-tidy
  • 140-height-limitations-on-multicolormarker
  • 142-manual-setting-height-too-restrictive
  • 146-structure-of-the-project
  • 147-reducing-quality-of-wrong-path-not-working-with-color-marker
  • 149-crash-when-holding-next-frame-button-down-too-long
  • 15-fix-warnings
  • 150-optimize-visual-representation-of-skeleton-coming-vfrom-c3d
  • 152-use-not-readable-code-marker-for-fixed-head-position
  • 154-license-header-missing-in-pmessagebox
  • 16-tracker-track-bug
  • 169-crash-in-trackerreal-calculate
  • 172-enlarge-crop-rect-for-arucocodemarker-with-colormarker-detection
  • 176-add-possibility-to-edit-chessboard-properties-to-gui
  • 177-create-recognizer-class
  • 178-add-tests-for-codemarkerwidget
  • 178-create-options-class-for-code-marker
  • 187-use-pointer-approach-for-ui-to-decrease-compile-time
  • 188-raise-warning-level-and-fix-warnings-on-msvc
  • 191-retrack-only-if-whole-path-leading-to-the-current-trackpoint-is-better
  • 192-fix-playback-speed-for-image-sequence
  • 195-support-mutliple-mocap-files
  • 199-wrong-compile-date
  • 20-remove-commented-code
  • 201-allow-selection-of-multiple-mocap-files-in-file-dialog
  • 2021-09-11-mac-installer
  • 20220201-master-backup
  • 205-confidential-issue
  • 209-optimize-multicolormarkerwitharuco_dictmip36h12-test-case
  • 210-make-minmarkerperimeter-and-maxmarkerperimeter-user-configured-for-multi-aruco
  • 213-add-more-intrinsic-calibration-parameters
  • 213-add-more-intrinsic-calibration-parameters-2
  • 216-add-utility-script-for-comparison-of-regression-test-data
  • 220-petrack-crashes-on-cvtcolor
  • 222-mocap-time-offset-is-changed-when-read-in
  • 223-refactor-personstorage-out-of-tracker
  • 224-create-autosave-class-and-mechanism
  • 227-add-script-which-checks-if-license-header-is-added-to-new-source-files
  • 228-create-intrinisc-calibration-project-from-command-line
  • 229-change-to-new-connect-syntax
  • 231-change-mocap-dialog-to-same-style-as-rest
  • 236-show-current-point
  • 240-lk-optical-flow
  • 242-only_people_nr_list-saved-wrong-in-pet-file
  • 243-mocap-management-dialog-improve-usability
  • 246-save-video-as-mp4-quick
  • 247-flickering-of-the-trajectory-overlay
  • 250-saving-pet-file-changes-values
  • 251-follow-up-from-resolve-add-more-intrinsic-calibration-parameters
  • 253-intrinsic-calibration-from-video
  • 259-saving-trc-files-after-opening-a-new-project
  • 269-make-shortcut-export
  • 274-merge-doesn-t-delete-already-merged-person-from-further-evaluation
  • 279-ask-if-intrinsic-calibration-should-be-changed-when-trajectory-already-present
  • 283-make-sure-that-the-offscreen-plugin-is-also-included-in-windows-installer
  • 284-check-frame-number-of-loaded-trc-files
  • 291-move-to-frame
  • 293-correct-move-trackpoint-along-visible-trajectory
  • 296-fix-warning-on-msvc
  • 299-correct-tab-order
  • 302-disable-scrolling-in-spinboxes-when-not-desired
  • 303-tooltip-chessboard-properties
  • 305-intrinsic-calibration-switch-between-models
  • 315-crash-when-using-5-calibration-points-for-extrinsic-calibration
  • 316-ext-model-always-enabled
  • 317-case-sensitivity-on-file-endings
  • 321-version-in-pet-file-not-always-major-minor-patch
  • 322-empty-lines-in-the-height-file
  • 328-alt-doubleclickleft-also-triggers-alt-clickleft
  • 328-alt-doubleclickleft-also-triggers-alt-clickleft-2
  • 329-make-sure-that-every-slider-also-gets-a-spinbox
  • 330-remove-non-const-global-pointer-to-control
  • 332-setting-playback-speed-influences-exported-framerate-in-trajectory-files
  • 333-make-slider-only-scrollable-when-clicking-on-them
  • 333-make-slider-only-scrollable-when-clicking-on-them-2
  • 338-greyscale-image-sequence-not-visable
  • 34-check-includes
  • 345-make-change-between-different-intrinsic-calibration-without-losing-trackpoints
  • 348-autosave-popup-when-starting-without-project
  • 349-extensibility-of-trackpoint
  • 353-check-whether-mprofile-is-a-directory
  • CroMa
  • v0.10
  • v0.8
  • v0.9
  • v1.0
105 results
Show changes
Commits on Source (19)
......@@ -36,6 +36,16 @@ namespace Ui
class Control;
}
/**
* @brief struct used for storing intrinsic camera params.
*
* Central place to store this information and easier passing in methods
*/
using IntrinsicCameraParams = struct IntrinsicCameraParams
{
cv::Mat cameraMatrix = cv::Mat::eye(cv::Size(3, 3), CV_64F);
};
class Control : public QWidget
{
Q_OBJECT
......@@ -124,6 +134,8 @@ public:
bool getRecoRoiFix() const;
void setRecoRoiFix(bool b);
reco::RecognitionMethod getRecoMethod() const;
bool getTrackRoiShow() const;
void setTrackRoiShow(bool b);
bool getTrackRoiFix() const;
......@@ -348,6 +360,13 @@ public:
bool isExportCommentChecked() const;
/**
* @brief Get read-only IntrinsicCameraParams.
*
* The params can be changed by setting its content e.g. camera params (fx, fy, cx, cy) directly
*/
inline IntrinsicCameraParams getIntrinsicCameraParams() const { return mIntrinsicCameraParams; }
#ifdef QWT
AnalysePlot *getAnalysePlot() const;
#endif
......@@ -363,9 +382,6 @@ public:
return mMainWindow;
}
private:
reco::RecognitionMethod getRecoMethod() const;
private slots:
void on_anaCalculate_clicked();
......@@ -717,10 +733,11 @@ signals:
void userChangedRecoMethod(reco::RecognitionMethod method);
private:
Petrack *mMainWindow;
Ui::Control *mUi;
QGraphicsScene *mScene;
bool mColorChanging;
Petrack *mMainWindow;
Ui::Control *mUi;
IntrinsicCameraParams mIntrinsicCameraParams;
QGraphicsScene *mScene;
bool mColorChanging;
bool mIndexChanging; // shows, if the index of the color model is really changing; nor while constructor (initialer
// durchlauf) and may be while loading xml file
bool mLoading; // shows, if new project is just loading
......
......@@ -109,6 +109,7 @@ public:
~Petrack();
static int trcVersion; // version numbr for writing TRC-Trajectorie files
protected:
void closeEvent(QCloseEvent *event);
......
......@@ -27,12 +27,14 @@
#include <QObject>
#include <opencv2/aruco.hpp>
class TrackPoint;
class QRect;
class BackgroundFilter;
class Control;
class ImageItem;
class CodeMarkerItem;
struct IntrinsicCameraParams;
namespace reco
{
......@@ -183,6 +185,7 @@ signals:
void indexOfMarkerDictChanged();
};
class Recognizer : public QObject
{
Q_OBJECT
......@@ -195,8 +198,13 @@ private:
RecognitionMethod mRecoMethod = RecognitionMethod::MultiColor;
public:
QList<TrackPoint>
getMarkerPos(cv::Mat &img, QRect &roi, Control *controlWidget, int borderSize, BackgroundFilter *bgFilter);
QList<TrackPoint> getMarkerPos(
cv::Mat &img,
QRect &roi,
Control *controlWidget,
int borderSize,
BackgroundFilter *bgFilter,
const IntrinsicCameraParams &intrinsicCameraParams);
RecognitionMethod getRecoMethod() const { return mRecoMethod; }
CodeMarkerOptions &getCodeMarkerOptions() { return mCodeMarkerOptions; }
......@@ -285,10 +293,11 @@ namespace detail
QList<TrackPoint> &crossList,
const BlackDotOptions &options);
void refineWithAruco(
std::vector<ColorBlob> &blobs,
const cv::Mat &img,
QList<TrackPoint> &crossList,
ArucoOptions &options);
std::vector<ColorBlob> &blobs,
const cv::Mat &img,
QList<TrackPoint> &crossList,
ArucoOptions &options,
const IntrinsicCameraParams &intrinsicCameraParams);
void resolveMoreThanOneCode(
const int lengthini,
......@@ -297,10 +306,11 @@ namespace detail
const Vec2F offset);
void findCodeMarker(
cv::Mat &img,
QList<TrackPoint> &crossList,
RecognitionMethod recoMethod,
const CodeMarkerOptions &opt);
cv::Mat &img,
QList<TrackPoint> &crossList,
RecognitionMethod recoMethod,
const CodeMarkerOptions &opt,
const IntrinsicCameraParams &intrinsicCameraParams);
cv::Ptr<cv::aruco::Dictionary> getDictMip36h12();
} // namespace detail
} // namespace reco
......
......@@ -59,6 +59,8 @@ private:
int mMarkerID; // ID of detected Marker
Vec3F mSp; // measured 3d point with stereo // mZdistanceToCam; // distance in z direction to camera - measured with
// stereo
cv::Vec3d
mOrientation; // orientation of marker i. e. head direction if the marker is placed facing that way (aruco)
public:
TrackPoint();
......@@ -68,16 +70,18 @@ public:
TrackPoint(const Vec2F &p, int qual, const QColor &col);
TrackPoint(const Vec2F &p, int qual, const Vec2F &colPoint, const QColor &col);
inline const Vec2F &colPoint() const { return mColPoint; }
inline void setColPoint(Vec2F &cp) { mColPoint = cp; }
inline const QColor &color() const { return mCol; }
inline void setColor(QColor &col) { mCol = col; }
inline void setColPoint(const Vec2F &colPoint) { mColPoint = colPoint; }
inline void setCol(const QColor &col) { mCol = col; }
inline int qual() const { return mQual; }
inline void setQual(int qual) { mQual = qual; }
inline int getMarkerID() const { return mMarkerID; }
inline void setMarkerID(int markerID) { mMarkerID = markerID; }
inline const Vec2F &colPoint() const { return mColPoint; }
inline void setColPoint(Vec2F &cp) { mColPoint = cp; }
inline const QColor &color() const { return mCol; }
inline void setColor(QColor &col) { mCol = col; }
inline void setColPoint(const Vec2F &colPoint) { mColPoint = colPoint; }
inline void setCol(const QColor &col) { mCol = col; }
inline int qual() const { return mQual; }
inline void setQual(int qual) { mQual = qual; }
inline int getMarkerID() const { return mMarkerID; }
inline void setMarkerID(int markerID) { mMarkerID = markerID; }
inline const cv::Vec3d &getOrientation() const { return mOrientation; }
inline void setOrientation(const cv::Vec3d &orientation) { mOrientation = orientation; }
inline const Vec3F &sp() const { return mSp; }
inline void setSp(const Vec3F &sp) { mSp = sp; }
......
......@@ -56,6 +56,7 @@ public:
inline void setAngleOfView(float a) { mAngleOfView = a; }
inline int getMarkerID() const { return mMarkerID; }
inline void setMarkerID(int markerID) { mMarkerID = markerID; }
inline void setViewDirection(const Vec2F &dir) { mViewDir = dir; }
};
inline QTextStream &operator<<(QTextStream &s, const TrackPointReal &tp)
......
......@@ -2536,6 +2536,7 @@ void Control::on_apply_stateChanged(int i)
void Control::on_fx_valueChanged(double d)
{
mIntrinsicCameraParams.cameraMatrix.at<double>(0, 0) = d;
mMainWindow->getCalibFilter()->getFx()->setValue(d);
if(mUi->quadAspectRatio->isChecked())
{
......@@ -2551,6 +2552,7 @@ void Control::on_fx_valueChanged(double d)
void Control::on_fy_valueChanged(double d)
{
mIntrinsicCameraParams.cameraMatrix.at<double>(1, 1) = d;
mMainWindow->getCalibFilter()->getFy()->setValue(d);
if(!mMainWindow->isLoading())
{
......@@ -2562,6 +2564,7 @@ void Control::on_fy_valueChanged(double d)
void Control::on_cx_valueChanged(double d)
{
mIntrinsicCameraParams.cameraMatrix.at<double>(0, 2) = d;
mMainWindow->setStatusPosReal();
mMainWindow->getCalibFilter()->getCx()->setValue(d);
if(!mMainWindow->isLoading())
......@@ -2573,6 +2576,7 @@ void Control::on_cx_valueChanged(double d)
void Control::on_cy_valueChanged(double d)
{
mIntrinsicCameraParams.cameraMatrix.at<double>(1, 2) = d;
mMainWindow->setStatusPosReal();
mMainWindow->getCalibFilter()->getCy()->setValue(d);
if(!mMainWindow->isLoading())
......
......@@ -3359,6 +3359,7 @@ void Petrack::updateImage(bool imageChanged) // default = false (only true for n
{
updateControlImage(mImgFiltered);
}
#ifndef STEREO_DISABLED
if(imageChanged || swapChanged || brightContrastChanged || borderChanged || calibChanged)
{
......@@ -3539,7 +3540,12 @@ void Petrack::updateImage(bool imageChanged) // default = false (only true for n
(recoMethod == reco::RecognitionMethod::Code)) // else
{
persList = mReco.getMarkerPos(
mImgFiltered, rect, mControlWidget, getImageBorderSize(), getBackgroundFilter());
mImgFiltered,
rect,
mControlWidget,
getImageBorderSize(),
getBackgroundFilter(),
mControlWidget->getIntrinsicCameraParams());
}
#ifndef STEREO_DISABLED
if(mStereoContext && mStereoWidget->stereoUseForReco->isChecked())
......
......@@ -604,12 +604,14 @@ void detail::refineWithBlackDot(
* @param img img in which the color blobs were detected
* @param crossList list of all detected people
* @param options all options, mostly forwarded from the GUI
* @param intrinsicCameraParams camera parameters needed to estimate arucomarker orientation
*/
void detail::refineWithAruco(
std::vector<ColorBlob> &blobs,
const cv::Mat &img,
QList<TrackPoint> &crossList,
ArucoOptions &options)
std::vector<ColorBlob> &blobs,
const cv::Mat &img,
QList<TrackPoint> &crossList,
ArucoOptions &options,
const IntrinsicCameraParams &intrinsicCameraParams)
{
constexpr int border = 4; // zusaetzlicher rand um subrects
......@@ -660,7 +662,7 @@ void detail::refineWithAruco(
// TODO: Use Reference to actual codeMarkerOptions in MulticolorMarkerOptions
// NOTE: For now, add as parameter of findMulticolorMarker
codeOpt.setOffsetCropRect2Roi(offsetCropRect2Roi);
findCodeMarker(subImg, crossList, options.method, codeOpt);
findCodeMarker(subImg, crossList, options.method, codeOpt, intrinsicCameraParams);
resolveMoreThanOneCode(lengthini, crossList, blob, offsetCropRect2Roi);
......@@ -772,15 +774,17 @@ void detail::resolveMoreThanOneCode(
* @param controlWidget
* @param ignoreWithoutMarker (is ignored->overwritten by cmWidget->ignoreWithoutDot->isChecked())
* @param offset
* @param intrinsicCameraParams needed for aruco-refinement
*/
void findMultiColorMarker(
cv::Mat &img,
QList<TrackPoint> &crossList,
Control *controlWidget,
bool ignoreWithoutMarker,
Vec2F &offset,
RecognitionMethod method,
CodeMarkerOptions &codeOpt)
cv::Mat &img,
QList<TrackPoint> &crossList,
Control *controlWidget,
bool ignoreWithoutMarker,
Vec2F &offset,
RecognitionMethod method,
CodeMarkerOptions &codeOpt,
const IntrinsicCameraParams &intrinsicCameraParams)
{
Petrack *mainWindow = controlWidget->getMainWindow();
MultiColorMarkerItem *cmItem = mainWindow->getMultiColorMarkerItem();
......@@ -876,7 +880,7 @@ void findMultiColorMarker(
controlWidget, ignoreWithoutMarker, autoCorrect, autoCorrectOnlyExport, method, codeOpt};
// adds to crosslist
refineWithAruco(blobs, img, crossList, options);
refineWithAruco(blobs, img, crossList, options, intrinsicCameraParams);
}
else
{
......@@ -1021,12 +1025,15 @@ void findColorMarker(cv::Mat &img, QList<TrackPoint> &crossList, Control *contro
* @param img
* @param crossList[out] list of detected TrackPoints
* @param controlWidget
* @param opt arucomarker parameters used for detection
* @param intrinsicCameraParams used for estimating arucomarker orientation
*/
void detail::findCodeMarker(
cv::Mat &img,
QList<TrackPoint> &crossList,
RecognitionMethod recoMethod,
const CodeMarkerOptions &opt)
cv::Mat &img,
QList<TrackPoint> &crossList,
RecognitionMethod recoMethod,
const CodeMarkerOptions &opt,
const IntrinsicCameraParams &intrinsicCameraParams)
{
CodeMarkerItem *codeMarkerItem = opt.getCodeMarkerItem();
Control *controlWidget = opt.getControlWidget();
......@@ -1137,6 +1144,19 @@ void detail::findCodeMarker(
codeMarkerItem->addDetectedMarkers(corners, ids, opt.getOffsetCropRect2Roi());
codeMarkerItem->addRejectedMarkers(rejected, opt.getOffsetCropRect2Roi());
if(ids.empty())
{
// if no markers are found return to prevent opencv errors because of empty corners and thus empty rvecs vectors
return;
}
// value only relevant for axis length when drawing axes
float markerLength = (float) opt.getDetectorParams().getMinCornerDistance();
std::vector<cv::Vec3d> rvecs, tvecs;
cv::Mat cameraMatrix = intrinsicCameraParams.cameraMatrix;
cv::Mat distCoeff = cv::Mat::zeros(cv::Size(1, 5), CV_32F);
cv::aruco::estimatePoseSingleMarkers(corners, markerLength, cameraMatrix, distCoeff, rvecs, tvecs);
// detected code markers
for(size_t i = 0; i < ids.size(); i++)
{
......@@ -1145,7 +1165,14 @@ void detail::findCodeMarker(
double y =
(corners.at(i).at(0).y + corners.at(i).at(1).y + corners.at(i).at(2).y + corners.at(i).at(3).y) * 0.25;
crossList.append(TrackPoint(Vec2F(x, y), 100, ids.at(i))); // 100 beste qualitaet
cv::Matx<double, 3, 3> rotMat;
cv::Rodrigues(rvecs[i], rotMat);
cv::Vec3d orientation = cv::normalize(rotMat * cv::Vec3d(0, 1, 0));
TrackPoint trackPoint(Vec2F(x, y), 100, ids.at(i)); // 100 beste qualitaet
trackPoint.setOrientation(orientation);
crossList.append(std::move(trackPoint));
}
}
......@@ -1290,11 +1317,17 @@ void findContourMarker(
* @param controlWidget
* @param borderSize
* @param bgFilter
* @param intrinsicCameraParams intrinsic parameters of the camera. Used for e.g. estimation of arucomarkers
*
* @return List of detected TrackPoints
*/
QList<TrackPoint>
Recognizer::getMarkerPos(cv::Mat &img, QRect &roi, Control *controlWidget, int borderSize, BackgroundFilter *bgFilter)
QList<TrackPoint> Recognizer::getMarkerPos(
cv::Mat &img,
QRect &roi,
Control *controlWidget,
int borderSize,
BackgroundFilter *bgFilter,
const IntrinsicCameraParams &intrinsicCameraParams)
{
int markerBrightness = controlWidget->getMarkerBrightness();
bool ignoreWithoutMarker = controlWidget->isMarkerIgnoreWithoutChecked();
......@@ -1322,13 +1355,20 @@ Recognizer::getMarkerPos(cv::Mat &img, QRect &roi, Control *controlWidget, int b
{
case RecognitionMethod::MultiColor:
findMultiColorMarker(
tImg, crossList, controlWidget, ignoreWithoutMarker, v, mRecoMethod, mCodeMarkerOptions);
tImg,
crossList,
controlWidget,
ignoreWithoutMarker,
v,
mRecoMethod,
mCodeMarkerOptions,
intrinsicCameraParams);
break;
case RecognitionMethod::Color:
findColorMarker(tImg, crossList, controlWidget);
break;
case RecognitionMethod::Code:
findCodeMarker(tImg, crossList, mRecoMethod, mCodeMarkerOptions);
findCodeMarker(tImg, crossList, mRecoMethod, mCodeMarkerOptions, intrinsicCameraParams);
break;
case RecognitionMethod::Casern:
[[fallthrough]];
......
......@@ -191,6 +191,7 @@ int TrackerReal::calculate(
const auto &person = persons[i];
addFrames = 0;
firstFrame = person.firstFrame();
Vec2F moveDir(0, 0); // used for head direction
if(person.height() < MIN_HEIGHT + 1)
{
......@@ -297,51 +298,24 @@ int TrackerReal::calculate(
<< person.firstFrame() + j << ") of person " << i + 1
<< ", extrapolated height is used!" << std::endl;
}
Vec2F moveDir(0, 0);
if(exportAutoCorrect)
{
moveDir += reco::autoCorrectColorMarker(person[j], mMainWindow->getControlWidget());
}
pos = imageItem->getPosReal((person[j] + moveDir + br).toQPointF(), bestZ);
if((exportViewingDirection) &&
(person[j].color().isValid())) // wenn blickrichtung mit ausgegeben werden soll
{
colPos =
imageItem->getPosReal((person[j].colPoint() + moveDir + br).toQPointF(), bestZ);
trackPersonReal.addEnd(pos, firstFrame + j, colPos - pos);
}
else
{
trackPersonReal.addEnd(Vec3F(pos.x(), pos.y(), bestZ), firstFrame + j);
}
trackPersonReal.addEnd(Vec3F(pos.x(), pos.y(), bestZ), firstFrame + j);
}
}
else
{
Vec2F moveDir(0, 0);
if(exportAutoCorrect)
{
moveDir += reco::autoCorrectColorMarker(person[j], mMainWindow->getControlWidget());
}
pos = imageItem->getPosReal((person[j] + moveDir + br).toQPointF(), height);
// die frame nummer der animation wird TrackPoint der PersonReal mitgegeben,
// da Index groesser sein kann, da vorher frames hinzugefuegt wurden duch
// trackPersonReal.init(firstFrame+addFrames, height) oder aber innerhalb des trackink path
// mit for schleife ueber f
if((exportViewingDirection) &&
(person[j].color().isValid())) // wenn blickrichtung mit ausgegeben werden soll
{
colPos = imageItem->getPosReal((person[j].colPoint() + moveDir + br).toQPointF(), height);
trackPersonReal.addEnd(pos, firstFrame + j, colPos - pos);
}
else
{
trackPersonReal.addEnd(pos, firstFrame + j);
}
trackPersonReal.addEnd(pos, firstFrame + j);
if(exportAngleOfView)
{
angle = (90. -
......@@ -356,6 +330,34 @@ int TrackerReal::calculate(
}
}
if(exportViewingDirection)
{
auto method = petrack->getControlWidget()->getRecoMethod();
// multicolor markers can also be used together with code markers
if(method == reco::RecognitionMethod::Code || method == reco::RecognitionMethod::MultiColor)
{
auto orientation = person[j].getOrientation();
orientation = petrack->getExtrCalibration()->camToWorldRotation(orientation);
trackPersonReal.last().setViewDirection(Vec2F(orientation[0], orientation[1]).unit());
}
else
{
// old implementation for expeortViewingDirection did not check for specific marker, so just use
// the else
// die frame nummer der animation wird TrackPoint der PersonReal mitgegeben,
// da Index groesser sein kann, da vorher frames hinzugefuegt wurden duch
// trackPersonReal.init(firstFrame+addFrames, height) oder aber innerhalb des trackink path
// mit for schleife ueber f
if((exportViewingDirection) &&
(person[j].color().isValid())) // wenn blickrichtung mit ausgegeben werden soll
{
colPos = imageItem->getPosReal((person[j].colPoint() + moveDir + br).toQPointF(), height);
trackPersonReal.last().setViewDirection(colPos - pos);
}
}
}
if(tmpMissingList.size() > 0)
{
if((tmpMissingList.first() == firstFrame + j) && (person.trackPointExist(firstFrame + j + 1)))
......@@ -391,7 +393,8 @@ int TrackerReal::calculate(
}
else
{
Vec2F moveDir(0, 0);
// use local variable an just reset the value
moveDir.set(0, 0);
if(exportAutoCorrect)
{
moveDir += reco::autoCorrectColorMarker(person[j], mMainWindow->getControlWidget());
......
......@@ -5427,7 +5427,7 @@
</size>
</property>
<property name="toolTip">
<string>add direction of head (corresponding to view direction; possible with Japan and casern marker)</string>
<string>add direction of head (corresponding to view direction; possible with Japan, casern and code marker)</string>
</property>
<property name="text">
<string>add head direction</string>
......