How to measure the dimension of object with webcam video openCV?

asked 2014-05-22 11:15:32 -0500

norzanbzura gravatar image

Actually I want to build a system/application that can measure the dimension/size of the object by using OpenCV, but I doesn't have any idea how to code the measurement function. Here is the code.


#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 = 100;
    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);
    }

    //Show in a window
    namedWindow("Object Measurement", CV_WINDOW_AUTOSIZE);
    imshow("Object Measurement",frame);

    int c = cvWaitKey(10);
    if ((char) c==72)

        break;
}

return 0;

}

edit retag flag offensive close merge delete