Ask Your Question

Revision history [back]

click to hide/show revision 1
initial version

How to measure the dimension of object with OpenCV?

Here I have the main code but I don't know how to code for the measurement function. Really need for someone help. Thank you in advance.

#include "opencv2/highgui/highgui.hpp"
#include "opencv/cv.h"
#include <opencv/cxcore.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>

using namespace cv;
using namespace std;

int main(int, char**)
{
    Mat src;
    Mat src_gray;
    int thresh = 50;
    int max_thresh = 255;
    RNG rng (12345);

cv::Mat frame;
VideoCapture capture;
capture.open(0);

while (true)
{
    capture.read(frame);
    Mat threshold_output;
    vector<vector<Point>> contours;
    vector<Vec4i> hierarchy;

    cvtColor(frame, src_gray, CV_BGR2GRAY); //produce out2, a one-channel image (CV_BUC1)
    blur(src_gray, src_gray, Size(5,5));

    threshold(src_gray, threshold_output, thresh, max_thresh, CV_THRESH_BINARY_INV);

    findContours(threshold_output, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE, Point(0,0));

    //Find the rotated rectangles
    vector<RotatedRect> minRect(contours.size());

    for(int i=0; i<contours.size(); i++)
    {
        minRect[i] = minAreaRect(Mat(contours[i]));
    }

    //Draw contours + rotated rectangles + ellipses
    Mat drawing = Mat::zeros(threshold_output.size(), CV_8UC3);

    for(int i=0; i<contours.size(); i++)
    {
        Scalar color = Scalar(rng.uniform(0,0), rng.uniform(0,0), rng.uniform(250,250));

        //countours
        drawContours(drawing, contours, i, color, 1,8, vector<Vec4i>(), 0, Point());

        //Rotated rectangle
        Point2f rect_points[4]; minRect[i].points(rect_points);

        for(int j=0; j<4; j++)
            line(frame, rect_points[j], rect_points[(j+1)%4], color, 1, 8);
    }

    //Sensor physical size
    cv::VideoCapture cap;

    if (!cap.isOpened())  // check if we succeeded
        CV_Assert("Can't open Web-Cam");

    double CamHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT);
    double CamWidth  = cap.get(CV_CAP_PROP_FRAME_WIDTH);

    // Function for display the object dimension
    int imgW = 650;
    int imgH = 50;
    int fontFace = FONT_HERSHEY_PLAIN;
    double fontScale = 1.5;
    int thickness = 2;
    Point textOrg(imgW/5, imgH/1.3);

    int value=10;
    string someText = format("Dimension: %d mm", value);            // Display the dimension
    putText(frame, someText, textOrg, fontFace, fontScale, Scalar::all(255), thickness,8);
    imshow("Object Measurement",frame);

    int c = cvWaitKey(10);  //Delay in milliseconds
    if ((char) c==72)

        break;
}

return 0;

}