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;
}
Can you upload some examples of detections?
Hi GiLevi, this http://www.youtube.com/watch?v=bcswZLwhTUI enough to I tell you on what I want to do. Basically the code above can run properly. But it has a lack of important function which is measurement function. Can you help me to solve this? Thank you in advance.