ROS Resources: Documentation | Support | Discussion Forum | Index | Service Status | ros @ Robotics Stack Exchange
Ask Your Question
0

Streaming RGB with asus and using houghlines algorithm

asked 2014-08-05 02:17:35 -0500

Azl gravatar image

updated 2014-08-05 02:39:03 -0500

BennyRe gravatar image

Im currently using Ubuntu and running on ROS groovy.

My intention is to live stream RGB images from Asus Xtion pro and run the houghlines transform algorithm from opencv. I created my own package and ran the code for the openCV houghlines codes and manage to detect lines from images that i put into it.

But how can i combine live stream image from asus with the houghline algorithm? I want to detect a marked out box on the floor using a Asus Xtion Pro and finding the center point of the box.

Can any one help me with this. I just started using ROS and OpenCV and went through the tutorial.


include "opencv2/highgui/highgui.hpp"
include "opencv2/imgproc/imgproc.hpp"

include <iostream>

using namespace cv;
using namespace std;

static void help()
{
    cout << "\nThis program demonstrates line finding with the Hough transform.\n"
            "Usage:\n"
            "./houghlines <image_name>, Default is Trapezium.jpg\n" << endl;
}

int main(int argc, char** argv)
{
    const char* filename = argc >= 2 ? argv[1] : "Trapezium.jpg";

    Mat src = imread(filename, 0);
    if(src.empty())
    {
        help();
        cout << "can not open " << filename << endl;
        return -1;
    }

    Mat dst, cdst;
    Canny(src, dst, 50, 200, 3);
    cvtColor(dst, cdst, COLOR_GRAY2BGR);

    if 0
    vector<Vec2f> lines;
    HoughLines(dst, lines, 1, CV_PI/180, 100, 0, 0 );

    for( size_t i = 0; i < lines.size(); i++ )
    {
        float rho = lines[i][0], theta = lines[i][1];
        Point pt1, pt2;
        double a = cos(theta), b = sin(theta);
        double x0 = a*rho, y0 = b*rho;
        pt1.x = cvRound(x0 + 1000*(-b));
        pt1.y = cvRound(y0 + 1000*(a));
        pt2.x = cvRound(x0 - 1000*(-b));
        pt2.y = cvRound(y0 - 1000*(a));
        line( cdst, pt1, pt2, Scalar(0,0,255), 3, CV_AA);
    }
    else
        vector<Vec4i> lines;
    HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 );
    for( size_t i = 0; i < lines.size(); i++ )
    {
        Vec4i l = lines[i];
        line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, CV_AA);
    }
    endif
    imshow("source", src);
    imshow("detected lines", cdst);

    waitKey();

    return 0;
}
edit retag flag offensive close merge delete

1 Answer

Sort by ยป oldest newest most voted
0

answered 2014-08-05 03:10:51 -0500

Hi there and welcome to ROS

You should check out the tutorial Writting a simple image subscriber, there you have a clear explanation on how to subscribe to an image topic and transform that to an OpenCV-compatible data structure using cv_bridge.

Then on the image subscriber callback you execute the routine that you implemented to detect HoughLines.

Avoid using cv::imshow and cv::waitKey inside the callback or be really careful using it. If you want to visualise the results I would recommend you to publish the result of your processing (cdst in the code that you posetd) into its own topic and use the package image_view to visualize it.

Then to start the Asus Xtion Pro run the command:

roslaunch openni2_launch openni2.launch

This will publish the topic /camera/rgb/image_raw (among others)

Then run the node that you will implement following the tutorial that I mentioned before, remapping the topic camera/image to /camera/rgb/image_raw.

edit flag offensive delete link more

Comments

Thanks for the prompt reply. Greatly appreciated. I will start on the tutorial above.

Azl gravatar image Azl  ( 2014-08-05 04:14:59 -0500 )edit

Question Tools

1 follower

Stats

Asked: 2014-08-05 02:17:35 -0500

Seen: 674 times

Last updated: Aug 05 '14