I'm currently trying to detect whether a level crossing barrier has been deployed on an image using HoughLines
in OpenCV
. I thought my code would draw a line on my image, so long as the barrier appears in it - but instead I get an error message saying "Mat data type is not compatible". Can show me how to detect lines in Java with OpenCV?
public class DetectLines {
public static void main(String args[]) {
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
Mat eventless = Highgui.imread("files/eventless.png");
Mat barrier = Highgui.imread("files/barrier/lc-00201.png");
Mat difference = new Mat();
Mat lines = new Mat();
Core.absdiff(eventless, barrier, difference);
Mat grey = new Mat();
Imgproc.cvtColor(difference, grey, Imgproc.COLOR_BGR2GRAY);
Imgproc.HoughLines(grey, lines, 5.0, 4.0, 7);
Imshow ims1 = new Imshow("Lines");
ims1.showImage(lines);
}
}
The lines are returned in the lines matrix, which has two columns in which each line returns the rho and theta parameters of the polar coordinates. These coordinates refer to the distance between the top-left corner of the image and the line rotation in radians, respectively. So, in order to use the show method you must create a Mat that will represent the lines using the line coordinates.
public Mat getHoughTransform(Mat image, double rho, double theta, int threshold) {
Mat result = Image.getInstance().getImage().clone();
Mat lines = new Mat();
Imgproc.HoughLines(image, lines, rho, theta, threshold);
for (int i = 0; i < lines.cols(); i++) {
double data[] = lines.get(0, i);
double rho1 = data[0];
double theta1 = data[1];
double cosTheta = Math.cos(theta1);
double sinTheta = Math.sin(theta1);
double x0 = cosTheta * rho1;
double y0 = sinTheta * rho1;
Point pt1 = new Point(x0 + 10000 * (-sinTheta), y0 + 10000 * cosTheta);
Point pt2 = new Point(x0 - 10000 * (-sinTheta), y0 - 10000 * cosTheta);
Imgproc.line(result, pt1, pt2, new Scalar(0, 0, 255), 2);
}
return result;
}
And this is a easier way to do it. It involve the Imgproc.HoughLinesP method.
public Mat getHoughPTransform(Mat image, double rho, double theta, int threshold) {
Mat result = Image.getInstance().getImage().clone();
Mat lines = new Mat();
Imgproc.HoughLinesP(image, lines, rho, theta, threshold);
for (int i = 0; i < lines.cols(); i++) {
double[] val = lines.get(0, i);
Imgproc.line(result, new Point(val[0], val[1]), new Point(val[2], val[3]), new Scalar(0, 0, 255), 2);
}
return result;
}
in Android or Java its the same idia.you must to do it in for (); to get the theta and row after you get start point and the end point ,you can core the line.(core.line) but dont forget to transfer the mat that you get the values from her to other. after this>>release the mat. hope thats its help u. r.i enjoy
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With