puku0x/cvdrone

multicolor tracking

rezaprasetyo opened this issue · 9 comments

hello there, you help me alot on my final project.

can you help me about tracking multicolor? because i need to track like green,blue,red, and black in ar drone camera.

thanks :)

This is it !

#include "ardrone/ardrone.h"

// Thresholds
class Thresholds {
public:
    Thresholds() {
        minH = minS = minV = 0;
        maxH = maxS = maxV = 255;
    }
    int minH, maxH;
    int minS, maxS;
    int minV, maxV;
};

// Find the largest object in a binalized image
cv::Rect findLargestBoundingRect(cv::Mat img)
{
    cv::Rect rect;
    cv::Mat tmp = img.clone();

    // De-noising
    cv::Mat kernel = getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
    cv::morphologyEx(tmp, tmp, cv::MORPH_CLOSE, kernel);

    // Detect contours
    std::vector< std::vector<cv::Point> > contours;
    cv::findContours(tmp, contoursRed, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE);

    // Find largest contour
    int contour_index = -1;
    double max_area = 0.0;
    for (size_t i = 0; i < contours.size(); i++) {
        double area = fabs(cv::contourArea(contours[i]));
        if (area > max_area) {
            contour_index = i;
            max_area = area;
        }
    }

    // Object detected
    if (contour_index >= 0) {
        rect = cv::boundingRect(contours[contour_index]);
    }

    return rect;
}

// --------------------------------------------------------------------------
// main(Number of arguments, Argument values)
// Description  : This is the entry point of the program.
// Return value : SUCCESS:0  ERROR:-1
// --------------------------------------------------------------------------
int main(int argc, char *argv[])
{
    // AR.Drone class
    ARDrone ardrone;

    // Initialize
    if (!ardrone.open()) {
        std::cout << "Failed to initialize." << std::endl;
        return -1;
    }

    // XML save data
    std::string filename("thresholds.xml");
    cv::FileStorage fs(filename, cv::FileStorage::READ);

    // If there is a save file then read it
    Thresholds thblue, thGreen, thBlue, thBlack;
    if (fs.isOpened()) {
        thRed.maxH   = fs["H_MAX_RED"];
        thRed.minH   = fs["H_MIN_RED"];
        thRed.maxS   = fs["S_MAX_RED"];
        thRed.minS   = fs["S_MIN_RED"];
        thRed.maxV   = fs["V_MAX_RED"];
        thRed.minV   = fs["V_MIN_RED"];
        thGreen.maxH = fs["H_MAX_GREEN"];
        thGreen.minH = fs["H_MIN_GREEN"];
        thGreen.maxS = fs["S_MAX_GREEN"];
        thGreen.minS = fs["S_MIN_GREEN"];
        thGreen.maxV = fs["V_MAX_GREEN"];
        thGreen.minV = fs["V_MIN_GREEN"];
        thBlue.maxH   = fs["H_MAX_BLUE"];
        thBlue.minH   = fs["H_MIN_BLUE"];
        thBlue.maxS   = fs["S_MAX_BLUE"];
        thBlue.minS   = fs["S_MIN_BLUE"];
        thBlue.maxV   = fs["V_MAX_BLUE"];
        thBlue.minV   = fs["V_MIN_BLUE"];
        thBlack.maxH  = fs["H_MAX_BLACK"];
        thBlack.minH  = fs["H_MIN_BLACK"];
        thBlack.maxS  = fs["S_MAX_BLACK"];
        thBlack.minS  = fs["S_MIN_BLACK"];
        thBlack.maxV  = fs["V_MAX_BLACK"];
        thBlack.minV  = fs["V_MIN_BLACK"];
        fs.release();
    }

    // Create a window
    cv::namedWindow("red");
    cv::createTrackbar("H max", "red", &thRed.maxH, 255);
    cv::createTrackbar("H min", "red", &thRed.minH, 255);
    cv::createTrackbar("S max", "red", &thRed.maxS, 255);
    cv::createTrackbar("S min", "red", &thRed.minS, 255);
    cv::createTrackbar("V max", "red", &thRed.maxV, 255);
    cv::createTrackbar("V min", "red", &thRed.minV, 255);
    cv::resizeWindow("red", 0, 0);
    cv::namedWindow("green");
    cv::createTrackbar("H max", "green", &thGreen.maxH, 255);
    cv::createTrackbar("H min", "green", &thGreen.minH, 255);
    cv::createTrackbar("S max", "green", &thGreen.maxS, 255);
    cv::createTrackbar("S min", "green", &thGreen.minS, 255);
    cv::createTrackbar("V max", "green", &thGreen.maxV, 255);
    cv::createTrackbar("V min", "green", &thGreen.minV, 255);
    cv::resizeWindow("green", 0, 0);
    cv::namedWindow("blue");
    cv::createTrackbar("H max", "blue", &thBlue.maxH, 255);
    cv::createTrackbar("H min", "blue", &thBlue.minH, 255);
    cv::createTrackbar("S max", "blue", &thBlue.maxS, 255);
    cv::createTrackbar("S min", "blue", &thBlue.minS, 255);
    cv::createTrackbar("V max", "blue", &thBlue.maxV, 255);
    cv::createTrackbar("V min", "blue", &thBlue.minV, 255);
    cv::resizeWindow("blue", 0, 0);
    cv::namedWindow("black");
    cv::createTrackbar("H max", "black", &thBlack.maxH, 255);
    cv::createTrackbar("H min", "black", &thBlack.minH, 255);
    cv::createTrackbar("S max", "black", &thBlack.maxS, 255);
    cv::createTrackbar("S min", "black", &thBlack.minS, 255);
    cv::createTrackbar("V max", "black", &thBlack.maxV, 255);
    cv::createTrackbar("V min", "black", &thBlack.minV, 255);
    cv::resizeWindow("black", 0, 0);

    // Main loop
    while (1) {
        // Key input
        int key = cv::waitKey(33);
        if (key == 0x1b) break;

        // Get an image
        cv::Mat image = ardrone.getImage();

        // HSV image
        cv::Mat hsv;
        cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV_FULL);

        // Binalize
        cv::Mat red, green, blue, black;
        cv::inRange(hsv, cv::Scalar(thRed.minH, thRed.minS, thRed.minV),       cv::Scalar(thRed.maxH, thRed.maxS, thRed.maxV),       red);
        cv::inRange(hsv, cv::Scalar(thGreen.minH, thGreen.minS, thGreen.minV), cv::Scalar(thGreen.maxH, thGreen.maxS, thGreen.maxV), green);
        cv::inRange(hsv, cv::Scalar(thBlue.minH, thBlue.minS, thBlue.minV),    cv::Scalar(thBlue.maxH, thBlue.maxS, thBlue.maxV),    blue);
        cv::inRange(hsv, cv::Scalar(thBlack.minH, thBlack.minS, thBlack.minV), cv::Scalar(thBlack.maxH, thBlack.maxS, thBlack.maxV), black);

        // Show results
        cv::imshow("red", red);
        cv::imshow("green", green);
        cv::imshow("blue", blue);
        cv::imshow("black", black);
        cv::rectangle(image, findLargestBoundingRect(red),   cv::Scalar(255,0,0));
        cv::rectangle(image, findLargestBoundingRect(green), cv::Scalar(0,255,0));
        cv::rectangle(image, findLargestBoundingRect(blue),  cv::Scalar(0,0,255));
        cv::rectangle(image, findLargestBoundingRect(black), cv::Scalar(0,0,0));

        // Display the image
        cv::imshow("camera", image);
    }

    // Save thresholds
    fs.open(filename, cv::FileStorage::WRITE);
    if (fs.isOpened()) {
        cv::write(fs, "H_MAX_RED",   thRed.maxH);
        cv::write(fs, "H_MIN_RED",   thRed.minH);
        cv::write(fs, "S_MAX_RED",   thRed.maxS);
        cv::write(fs, "S_MIN_RED",   thRed.minS);
        cv::write(fs, "V_MAX_RED",   thRed.maxV);
        cv::write(fs, "V_MIN_RED",   thRed.minV);
        cv::write(fs, "H_MAX_GREEN", thGreen.maxH);
        cv::write(fs, "H_MIN_GREEN", thGreen.minH);
        cv::write(fs, "S_MAX_GREEN", thGreen.maxS);
        cv::write(fs, "S_MIN_GREEN", thGreen.minS);
        cv::write(fs, "V_MAX_GREEN", thGreen.maxV);
        cv::write(fs, "V_MIN_GREEN", thGreen.minV);
        cv::write(fs, "H_MAX_BLUE",  thBlue.maxH);
        cv::write(fs, "H_MIN_BLUE",  thBlue.minH);
        cv::write(fs, "S_MAX_BLUE",  thBlue.maxS);
        cv::write(fs, "S_MIN_BLUE",  thBlue.minS);
        cv::write(fs, "V_MAX_BLUE",  thBlue.maxV);
        cv::write(fs, "V_MIN_BLUE",  thBlue.minV);
        cv::write(fs, "H_MAX_BLACK", thBlack.maxH);
        cv::write(fs, "H_MIN_BLACK", thBlack.minH);
        cv::write(fs, "S_MAX_BLACK", thBlack.maxS);
        cv::write(fs, "S_MIN_BLACK", thBlack.minS);
        cv::write(fs, "V_MAX_BLACK", thBlack.maxV);
        cv::write(fs, "V_MIN_BLACK", thBlack.minV);
        fs.release();
    }

    // See you
    ardrone.close();

    return 0;
}

thank you very much for the program, and now, can you tell me how to get
the sensor data from the quadrotor?

thanks!

On Tue, Jan 26, 2016 at 8:45 PM, puku0x notifications@github.com wrote:

This is it !

#include "ardrone/ardrone.h"
// Thresholdsclass Thresholds {public:
Thresholds() {
minH = minS = minV = 0;
maxH = maxS = maxV = 255;
}
int minH, maxH;
int minS, maxS;
int minV, maxV;
};
// Find the largest object in a binalized image
cv::Rect findLargestBoundingRect(cv::Mat img)
{
cv::Rect rect;
cv::Mat tmp = img.clone();

// De-noising
cv::Mat kernel = getStructuringElement(cv::MORPH_RECT, cv::Size(3, 3));
cv::morphologyEx(tmp, tmp, cv::MORPH_CLOSE, kernel);

// Detect contours
std::vector< std::vector<cv::Point> > contours;
cv::findContours(tmp, contoursRed, cv::RETR_CCOMP, cv::CHAIN_APPROX_SIMPLE);

// Find largest contour
int contour_index = -1;
double max_area = 0.0;
for (size_t i = 0; i < contours.size(); i++) {
    double area = fabs(cv::contourArea(contours[i]));
    if (area > max_area) {
        contour_index = i;
        max_area = area;
    }
}

// Object detected
if (contour_index >= 0) {
    rect = cv::boundingRect(contours[contour_index]);
}

return rect;

}
// --------------------------------------------------------------------------// main(Number of arguments, Argument values)// Description : This is the entry point of the program.// Return value : SUCCESS:0 ERROR:-1// --------------------------------------------------------------------------int main(int argc, char *argv[])
{
// AR.Drone class
ARDrone ardrone;

// Initialize
if (!ardrone.open()) {
    std::cout << "Failed to initialize." << std::endl;
    return -1;
}

// XML save data
std::string filename("thresholds.xml");
cv::FileStorage fs(filename, cv::FileStorage::READ);

// If there is a save file then read it
Thresholds thblue, thGreen, thBlue, thBlack;
if (fs.isOpened()) {
    thRed.maxH   = fs["H_MAX_RED"];
    thRed.minH   = fs["H_MIN_RED"];
    thRed.maxS   = fs["S_MAX_RED"];
    thRed.minS   = fs["S_MIN_RED"];
    thRed.maxV   = fs["V_MAX_RED"];
    thRed.minV   = fs["V_MIN_RED"];
    thGreen.maxH = fs["H_MAX_GREEN"];
    thGreen.minH = fs["H_MIN_GREEN"];
    thGreen.maxS = fs["S_MAX_GREEN"];
    thGreen.minS = fs["S_MIN_GREEN"];
    thGreen.maxV = fs["V_MAX_GREEN"];
    thGreen.minV = fs["V_MIN_GREEN"];
    thBlue.maxH   = fs["H_MAX_BLUE"];
    thBlue.minH   = fs["H_MIN_BLUE"];
    thBlue.maxS   = fs["S_MAX_BLUE"];
    thBlue.minS   = fs["S_MIN_BLUE"];
    thBlue.maxV   = fs["V_MAX_BLUE"];
    thBlue.minV   = fs["V_MIN_BLUE"];
    thBlack.maxH  = fs["H_MAX_BLACK"];
    thBlack.minH  = fs["H_MIN_BLACK"];
    thBlack.maxS  = fs["S_MAX_BLACK"];
    thBlack.minS  = fs["S_MIN_BLACK"];
    thBlack.maxV  = fs["V_MAX_BLACK"];
    thBlack.minV  = fs["V_MIN_BLACK"];
    fs.release();
}

// Create a window
cv::namedWindow("red");
cv::createTrackbar("H max", "red", &thRed.maxH, 255);
cv::createTrackbar("H min", "red", &thRed.minH, 255);
cv::createTrackbar("S max", "red", &thRed.maxS, 255);
cv::createTrackbar("S min", "red", &thRed.minS, 255);
cv::createTrackbar("V max", "red", &thRed.maxV, 255);
cv::createTrackbar("V min", "red", &thRed.minV, 255);
cv::resizeWindow("red", 0, 0);
cv::namedWindow("green");
cv::createTrackbar("H max", "green", &thGreen.maxH, 255);
cv::createTrackbar("H min", "green", &thGreen.minH, 255);
cv::createTrackbar("S max", "green", &thGreen.maxS, 255);
cv::createTrackbar("S min", "green", &thGreen.minS, 255);
cv::createTrackbar("V max", "green", &thGreen.maxV, 255);
cv::createTrackbar("V min", "green", &thGreen.minV, 255);
cv::resizeWindow("green", 0, 0);
cv::namedWindow("blue");
cv::createTrackbar("H max", "blue", &thBlue.maxH, 255);
cv::createTrackbar("H min", "blue", &thBlue.minH, 255);
cv::createTrackbar("S max", "blue", &thBlue.maxS, 255);
cv::createTrackbar("S min", "blue", &thBlue.minS, 255);
cv::createTrackbar("V max", "blue", &thBlue.maxV, 255);
cv::createTrackbar("V min", "blue", &thBlue.minV, 255);
cv::resizeWindow("blue", 0, 0);
cv::namedWindow("black");
cv::createTrackbar("H max", "black", &thBlack.maxH, 255);
cv::createTrackbar("H min", "black", &thBlack.minH, 255);
cv::createTrackbar("S max", "black", &thBlack.maxS, 255);
cv::createTrackbar("S min", "black", &thBlack.minS, 255);
cv::createTrackbar("V max", "black", &thBlack.maxV, 255);
cv::createTrackbar("V min", "black", &thBlack.minV, 255);
cv::resizeWindow("black", 0, 0);

// Main loop
while (1) {
    // Key input
    int key = cv::waitKey(33);
    if (key == 0x1b) break;

    // Get an image
    cv::Mat image = ardrone.getImage();

    // HSV image
    cv::Mat hsv;
    cv::cvtColor(image, hsv, cv::COLOR_BGR2HSV_FULL);

    // Binalize
    cv::Mat red, green, blue, black;
    cv::inRange(hsv, cv::Scalar(thRed.minH, thRed.minS, thRed.minV),       cv::Scalar(thRed.maxH, thRed.maxS, thRed.maxV),       red);
    cv::inRange(hsv, cv::Scalar(thGreen.minH, thGreen.minS, thGreen.minV), cv::Scalar(thGreen.maxH, thGreen.maxS, thGreen.maxV), green);
    cv::inRange(hsv, cv::Scalar(thBlue.minH, thBlue.minS, thBlue.minV),    cv::Scalar(thBlue.maxH, thBlue.maxS, thBlue.maxV),    blue);
    cv::inRange(hsv, cv::Scalar(thBlack.minH, thBlack.minS, thBlack.minV), cv::Scalar(thBlack.maxH, thBlack.maxS, thBlack.maxV), black);

    // Show results
    cv::imshow("red", red);
    cv::imshow("green", green);
    cv::imshow("blue", blue);
    cv::imshow("black", black);
    cv::rectangle(image, findLargestBoundingRect(red),   cv::Scalar(255,0,0));
    cv::rectangle(image, findLargestBoundingRect(green), cv::Scalar(0,255,0));
    cv::rectangle(image, findLargestBoundingRect(blue),  cv::Scalar(0,0,255));
    cv::rectangle(image, findLargestBoundingRect(black), cv::Scalar(0,0,0));

    // Display the image
    cv::imshow("camera", image);
}

// Save thresholds
fs.open(filename, cv::FileStorage::WRITE);
if (fs.isOpened()) {
    cv::write(fs, "H_MAX_RED",   thRed.maxH);
    cv::write(fs, "H_MIN_RED",   thRed.minH);
    cv::write(fs, "S_MAX_RED",   thRed.maxS);
    cv::write(fs, "S_MIN_RED",   thRed.minS);
    cv::write(fs, "V_MAX_RED",   thRed.maxV);
    cv::write(fs, "V_MIN_RED",   thRed.minV);
    cv::write(fs, "H_MAX_GREEN", thGreen.maxH);
    cv::write(fs, "H_MIN_GREEN", thGreen.minH);
    cv::write(fs, "S_MAX_GREEN", thGreen.maxS);
    cv::write(fs, "S_MIN_GREEN", thGreen.minS);
    cv::write(fs, "V_MAX_GREEN", thGreen.maxV);
    cv::write(fs, "V_MIN_GREEN", thGreen.minV);
    cv::write(fs, "H_MAX_BLUE",  thBlue.maxH);
    cv::write(fs, "H_MIN_BLUE",  thBlue.minH);
    cv::write(fs, "S_MAX_BLUE",  thBlue.maxS);
    cv::write(fs, "S_MIN_BLUE",  thBlue.minS);
    cv::write(fs, "V_MAX_BLUE",  thBlue.maxV);
    cv::write(fs, "V_MIN_BLUE",  thBlue.minV);
    cv::write(fs, "H_MAX_BLACK", thBlack.maxH);
    cv::write(fs, "H_MIN_BLACK", thBlack.minH);
    cv::write(fs, "S_MAX_BLACK", thBlack.maxS);
    cv::write(fs, "S_MIN_BLACK", thBlack.minS);
    cv::write(fs, "V_MAX_BLACK", thBlack.maxV);
    cv::write(fs, "V_MIN_BLACK", thBlack.minV);
    fs.release();
}

// See you
ardrone.close();

return 0;

}


Reply to this email directly or view it on GitHub
#37 (comment).

Reza Prasetyo

Engineering Physics

Institut Teknologi Bandung

Here is a sample code which gets sensor values from AR.Drone.
https://github.com/puku0x/cvdrone/blob/master/samples/sample_navdata.cpp

More API references are in https://github.com/puku0x/cvdrone/wiki/API-reference

Regards,
puku0x

anyway, the multi color tracking isnt working. help please

anyway, the multi color tracking isnt working. help please

On Tue, Feb 2, 2016 at 11:23 AM, puku0x notifications@github.com wrote:

Here is a sample code which gets sensor values from AR.Drone.
https://github.com/puku0x/cvdrone/blob/master/samples/sample_navdata.cpp

More API references are in
https://github.com/puku0x/cvdrone/wiki/API-reference

Regards,
puku0x


Reply to this email directly or view it on GitHub
#37 (comment).

Reza Prasetyo

Engineering Physics

Institut Teknologi Bandung

visual studio said "thresholds is undefined" help me thanks

On Tue, Feb 2, 2016 at 11:48 AM, Reza Prasetyo rezaprasetyo15@gmail.com
wrote:

anyway, the multi color tracking isnt working. help please

On Tue, Feb 2, 2016 at 11:23 AM, puku0x notifications@github.com wrote:

Here is a sample code which gets sensor values from AR.Drone.
https://github.com/puku0x/cvdrone/blob/master/samples/sample_navdata.cpp

More API references are in
https://github.com/puku0x/cvdrone/wiki/API-reference

Regards,
puku0x


Reply to this email directly or view it on GitHub
#37 (comment).

Reza Prasetyo

Engineering Physics

Institut Teknologi Bandung

Reza Prasetyo

Engineering Physics

Institut Teknologi Bandung

Did you add Thresholds class ?

// Thresholds
class Thresholds {
public:
    Thresholds() {
        minH = minS = minV = 0;
        maxH = maxS = maxV = 255;
    }
    int minH, maxH;
    int minS, maxS;
    int minV, maxV;
};

hello guys,
I'm new here, but I was trying the code puku0x wrote above (Thank you very much)
and it looks like the argument order is reversed when using cv::Scalar(...).

        cv::rectangle(image, findLargestBoundingRect(red),   cv::Scalar(255,0,0));
        cv::rectangle(image, findLargestBoundingRect(green), cv::Scalar(0,255,0));
        cv::rectangle(image, findLargestBoundingRect(blue),  cv::Scalar(0,0,255));

->

        cv::rectangle(image, findLargestBoundingRect(red),   cv::Scalar(0,0,255));
        cv::rectangle(image, findLargestBoundingRect(green), cv::Scalar(0,255,0));
        cv::rectangle(image, findLargestBoundingRect(blue),  cv::Scalar(255,0,0));

If this is not right, just ignore it.
Thanks
:)

hello guys,
I use the same code and it said "'contoursRed': undeclared identifier"
how do i fix this?

Thanks