1 | initial version |
I detect color and contour. if both colors are at distance then program works good detect contour for both color. but when colors having same border then is shows only one contour.
please guide me how can i do it.
Thank you very much in advance.
2 | No.2 Revision |
I detect color and contour. if both colors are at distance then program works good detect contour for both color. but when colors having same border then is shows only one contour.
please guide me how can i do it.
Thank you very much in advance.
3 | No.3 Revision |
I detect color and contour. if both colors are at distance then program works good detect contour for both color. but when colors having same border then is shows only one contour. as shown in picture there are 3 contour but i want contour for each color separately. there is one contour for both read and yellow color, i want to make contour separate like others two
#include <opencv2/core/core.hpp>
using namespace cv; using namespace std;
//---------------------------------- Global variables Mat imgOriginal, imgConvert, imgProcessed,imgProcessed1, imgThresholded, imgDrawing, imgToProcess; RNG rng(12345); int c1 = 0, c2=1; // c1 = Center Point of Big Circle and c2 = Center Point of Small Circle //double aAreaBig = 0; //
int main( int argc, char** argv[] ) { cout.precision(3); //---------------------------------- Declare Windows and Initial Positions cvNamedWindow( "Original", CV_WINDOW_AUTOSIZE ); cvNamedWindow( "Processed", CV_WINDOW_AUTOSIZE );
//------------------------------ This default setting is for red color and variables
vector< vector<Point> > contours;
vector< Vec4i > hierarchy;
//---------------------------------- Read an image and check for invalid input int imgHeight = 480, //Default 480 imgWidth = 640; //Default 640 CvSize imgSize = cvSize(imgWidth,imgHeight); // The saiz of the image used. Default capture size - 640x480.
VideoCapture p_capwebcam(0); //capture the video from default webcam and check it
if ( !p_capwebcam.isOpened() ){cout << "Cannot open the Web Cam" << endl;return -1;}
cout<<"Display this first. Press enter to start. Then, adjust the HSV level. HSV for Red 179,160,29 "<<endl;
getchar();
//---------------------------------- Start Looping while (true) { //Grab image frame bool bSuccess = p_capwebcam.read(imgOriginal); // read a new frame from video if (!bSuccess){ //if not success, break loop cout << "Cannot read a frame from video stream" << endl;getchar(); break;}
//---------------------------------- Image pre-processing and then display
//Convert the captured frame from BGR to HSV
cvtColor(imgOriginal, imgConvert, COLOR_BGR2HSV);
GaussianBlur(imgConvert,imgThresholded, Size(3,3), BORDER_DEFAULT );
//Checks if array elements lie between the elements of two other arrays.
inRange(imgThresholded, Scalar(0, 0, 90), Scalar(87, 118, 255), imgProcessed);
inRange(imgThresholded, Scalar(0, 78, 90), Scalar(179, 252, 255), imgProcessed1); // red
add(imgProcessed, imgProcessed1, imgToProcess, noArray(), 8);
//morphological opening (removes small objects from the foreground)
erode(imgToProcess, imgToProcess, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) );
dilate( imgToProcess, imgToProcess, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) );
//morphological closing (removes small holes from the foreground)
dilate( imgToProcess, imgToProcess, getStructuringElement(MORPH_ELLIPSE, Size(10,10)) );
erode(imgToProcess, imgToProcess, getStructuringElement(MORPH_ELLIPSE, Size(10,10)) );
imshow("Processed", imgToProcess);
//------------------------- Image Processing
//Find Contours
findContours(imgToProcess, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0,0));
/// Approximate contours to polygons + get bounding rects and circles
vector<vector<Point> > contours_poly( contours.size() );
vector<Rect> boundRect( contours.size() );
vector<Point2f>center( contours.size() );
vector<float>radius( contours.size() );
vector<float>area( contours.size() );
vector<RotatedRect> minRect( contours.size() );
for( size_t i = 0; i < contours.size(); i++ )
{ approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
boundRect[i] = boundingRect( Mat(contours_poly[i]) );
minEnclosingCircle( contours_poly[i], center[i], radius[i] );
area[i]= contourArea(Mat(contours_poly[i]));
}
/// Draw polygonal contour + bonding rects + circles
Mat imgDrawing = Mat::zeros( imgOriginal.size(), CV_8UC3 );
for( size_t i = 0; i< contours.size(); i++ )
{
Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
drawContours( imgOriginal, contours_poly, (int)i, color, 1, 8, vector<Vec4i>(), 0, Point() );
//rectangle( imgOriginal, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );
//circle( imgOriginal, center[i], (int)radius[i], color, 2, 8, 0 );
Point2f rect_points[4]; minRect[i].points( rect_points );
for( int j = 0; j < 4; j++ )
line( imgOriginal, rect_points[j], rect_points[(j+1)%4], color, 1, 8 );
//int H = boundRect[0].height*0.0355;
char height2[80];
itoa(boundRect[i].height*0.0355, height2,10);
//strcat(height2,"height");
}
imshow("Original",imgOriginal);
if (waitKey(30) == 27) {//wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop
cout << "ESC key is pressed by user" << endl;break;}
} //End While
} //End Main
please guide me how can i do it.
Thank you very much in advance.
4 | No.4 Revision |
I
this is example code to detect the contour for red color and contour. if both colors are at distance then program works good detect contour for both color. but when colors having same border then orange which is shows only one contour.
as shown joint in picture there are 3 contour but the picture.
i want contour for each orange and for red color separately. there is one contour for both read and yellow color, i want to make contour separate like others two
separately.
`
#includeusing namespace cv;
using namespace std;
//---------------------------------- Global variables
Mat imgOriginal, imgConvert, imgProcessed,imgProcessed1, imgThresholded, imgDrawing, imgToProcess;
std;
RNG rng(12345);
int c1 = 0, c2=1; // c1 = Center Point of Big Circle and c2 = Center Point of Small Circle
//double aAreaBig = 0; //
int main( int argc, char** argv[] )
{
cout.precision(3);
//---------------------------------- Declare Windows and Initial Positions
main ()
{
cvNamedWindow( "Original", CV_WINDOW_AUTOSIZE );
"RGB", 1 );
//cvNamedWindow( "HSV", 1 );
//cvNamedWindow( "Binary", 1 );
//cvNamedWindow( "Binary1", 1 );
cvNamedWindow( "Processed", CV_WINDOW_AUTOSIZE );
//------------------------------ This default setting is for red color and variables"Contour", 1 );
//cvNamedWindow( "Final", 1 );
Mat img,hsv,binary,binary1,imgToProcess;
img = imread("C:\\Users\\ankit\\Downloads\\wallpaper\\2.png"); //change this path according to your image file path
imshow("RGB",img);
//convert RGB image into HSV image
cvtColor(img, hsv, CV_BGR2HSV);
//imshow("HSV",hsv);
//get binary image
inRange(hsv, Scalar(0, 85, 241), Scalar(18, 255, 255), binary);
// imshow("Binary",binary);
inRange(hsv, Scalar(171, 0, 0), Scalar(255, 255, 255), binary1);
//binary.copyTo(binary1);
//imshow("Binary1",binary1);
add(binary1, binary, imgToProcess, noArray(), 8);
//absdiff(binary1, binary, imgToProcess);
imshow("Binary2",imgToProcess);
//find contours from binary image
vector< vector<Point> > contours;
vector< Vec4i > contours;
vector<Vec4i> hierarchy;
//---------------------------------- Read an image and check for invalid input int imgHeight = 480, //Default 480 imgWidth = 640; //Default 640 CvSize imgSize = cvSize(imgWidth,imgHeight); // The saiz of the image used. Default capture size - 640x480.
VideoCapture p_capwebcam(0); //capture the video from default webcam and check it
if ( !p_capwebcam.isOpened() ){cout << "Cannot open the Web Cam" << endl;return -1;}
cout<<"Display this first. Press enter to start. Then, adjust the HSV level. HSV for Red 179,160,29 "<<endl;
getchar();
//---------------------------------- Start Looping while (true) { //Grab image frame bool bSuccess = p_capwebcam.read(imgOriginal); // read a new frame from video if (!bSuccess){ //if not success, break loop cout << "Cannot read a frame from video stream" << endl;getchar(); break;}
//---------------------------------- Image pre-processing and then display
//Convert the captured frame from BGR to HSV
cvtColor(imgOriginal, imgConvert, COLOR_BGR2HSV);
GaussianBlur(imgConvert,imgThresholded, Size(3,3), BORDER_DEFAULT );
//Checks if array elements lie between the elements of two other arrays.
inRange(imgThresholded, Scalar(0, 0, 90), Scalar(87, 118, 255), imgProcessed);
inRange(imgThresholded, Scalar(0, 78, 90), Scalar(179, 252, 255), imgProcessed1); // red
add(imgProcessed, imgProcessed1, imgToProcess, noArray(), 8);
//morphological opening (removes small objects from the foreground)
erode(imgToProcess, imgToProcess, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) );
dilate( imgToProcess, imgToProcess, getStructuringElement(MORPH_ELLIPSE, Size(5, 5)) );
//morphological closing (removes small holes from the foreground)
dilate( imgToProcess, imgToProcess, getStructuringElement(MORPH_ELLIPSE, Size(10,10)) );
erode(imgToProcess, imgToProcess, getStructuringElement(MORPH_ELLIPSE, Size(10,10)) );
imshow("Processed", imgToProcess);
//------------------------- Image Processing
//Find Contours
findContours(imgToProcess, contours, hierarchy, CV_RETR_TREE, CV_CHAIN_APPROX_SIMPLE, Point(0,0));
/// Approximate Point(0, 0)); //find contours to polygons + get bounding rects and circles
vector<vector<Point> > contours_poly( contours.size() );
vector<RotatedRect> minRect( contours.size() );
vector<RotatedRect> minEllipse( contours.size() );
vector<Rect> boundRect( contours.size() );
vector<float>radius( contours.size() );
vector<float>area( contours.size() );
vector<Point2f>center( contours.size() );
vector<float>radius( contours.size() );
vector<float>area( contours.size() );
vector<RotatedRect> minRect( contours.size() );
for( size_t i = 0; i < contours.size(); i++ )
{ approxPolyDP( Mat(contours[i]), contours_poly[i], 3, true );
boundRect[i] = boundingRect( Mat(contours_poly[i]) );
minEnclosingCircle( contours_poly[i], center[i], radius[i] );
area[i]= contourArea(Mat(contours_poly[i]));
}
/// Draw polygonal contour + bonding rects + circles
Mat imgDrawing drawing = Mat::zeros( imgOriginal.size(), imgToProcess.size(), CV_8UC3 );
for( size_t int i = 0; i< contours.size(); i++ )
{
Scalar color = Scalar( rng.uniform(0, 255), rng.uniform(0,255), rng.uniform(0,255) );
drawContours( imgOriginal, contours_poly, (int)i, drawing, contours, i, color, 1, 8, vector<Vec4i>(), 0, Point() );
//rectangle( imgOriginal, ellipse( drawing, minEllipse[i], color, 2, 8 );// ellipse
rectangle( drawing, boundRect[i].tl(), boundRect[i].br(), color, 2, 8, 0 );
//circle( imgOriginal, center[i], (int)radius[i], color, 2, 8, 0 );
Point2f //Point2f rect_points[4]; minRect[i].points( rect_points );
for( //for( int j = 0; j < 4; j++ )
// line( imgOriginal, drawing, rect_points[j], rect_points[(j+1)%4], color, 1, 8 );
//int H = boundRect[0].height*0.0355;
char height2[80];
itoa(boundRect[i].height*0.0355, height2,10);
//strcat(height2,"height");
}
imshow("Original",imgOriginal);
if (waitKey(30) == 27) {//wait }
imshow("Contour",drawing);
//wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop
cout << "ESC key is pressed by user" << endl;break;}
cvWaitKey();
return 0;
} //End While}
`
} //End Main
please guide me how can i do it.
Thank you very much in advance.
5 | No.5 Revision |
this is example code to detect the contour for red color and for orange which is shown joint in the picture. i want contour for orange and for red color separately.
` #include "opencv/cv.h"
#include "opencv/cv.h"
#include "opencv/highgui.h"
#include "opencv2/opencv.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/opencv.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "iostream"
#include "stdio.h"
#include "string"
#include <stdlib.h>
using namespace cv;
using namespace std;
RNG rng(12345);
int main ()
} `