android 中的 Houghlines with opencv
Houghlines in android with opencv
我正在尝试使用 opencv3 对四边形物体进行透视校正。我设法显示了线条,还使用 Imgproc.HoughLinesP()
实现了 Houghlines,并尝试使用 Imgproc.lines()
突出显示线条,但输出没有成功。下面是我的代码,我还附上了我的输出图像。
请让我知道发生了什么问题以及应该做什么...
Mat initImg; // initial image
Mat greyImg; // converted to grey
Mat lines = new Mat();
int threshold = 50;
int minLineSize = 20;
int lineGap = 10;
initImg = Imgcodecs.imread(imgLoc, 1);
greyImg = new Mat();
Imgproc.cvtColor(initImg, greyImg, Imgproc.COLOR_BGR2GRAY);
Bitmap bitm = Bitmap.createBitmap(greyImg.cols(), greyImg.rows(),Bitmap.Config.ARGB_8888);
Imgproc.blur(greyImg, greyImg, new Size(3.d, 3.d));
Imgproc.adaptiveThreshold(greyImg, greyImg, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 15, 4);
Imgproc.HoughLinesP(greyImg, lines, 1, Math.PI/180, threshold,
minLineSize, lineGap);
// lines returns rows x columns and rows is always 1. I dont know why please help me to understand
for (int x = 0; x < lines.cols(); x++) {
double[] vec = lines.get(0, x);
double[] val = new double[4];
double x1 = vec[0],
y1 = vec[1],
x2 = vec[2],
y2 = vec[3];
System.out.println(TAG+"Coordinates: x1=>"+x1+" y1=>"+y1+" x2=>"+x2+" y2=>"+y2);
Point start = new Point(x1, y1);
Point end = new Point(x2, y2);
Imgproc.line(greyImg, start, end, new Scalar(0,255, 0, 255), 3);
}
Utils.matToBitmap(greyImg, bitm);
if(bitm!=null){
Toast.makeText(getApplicationContext(), "Bitmap not null", Toast.LENGTH_SHORT).show();
iv.setImageBitmap(bitm);
}else{
Toast.makeText(getApplicationContext(), "Bitmap null", Toast.LENGTH_SHORT).show();
}
我的输出:
我终于设法得到了 houghlines。 houghlines 没有显示在灰色图像中,我提取了灰色图像中的 houghlines 但绘制了彩色图像中的线条并且它起作用了。
Imgproc.HoughLinesP(greyImg, lines, 1, Math.PI/180, threshold,
minLineSize, lineGap);
for (int x = 0; x < lines.rows(); x++)
{
double[] vec = lines.get(x, 0);
double x1 = vec[0],
y1 = vec[1],
x2 = vec[2],
y2 = vec[3];
Point start = new Point(x1, y1);
Point end = new Point(x2, y2);
double dx = x1 - x2;
double dy = y1 - y2;
double dist = Math.sqrt (dx*dx + dy*dy);
if(dist>300.d) // show those lines that have length greater than 300
Imgproc.line(initImg, start, end, new Scalar(0,255, 0, 255),5);// here initimg is the original image.
}
我正在尝试使用 opencv3 对四边形物体进行透视校正。我设法显示了线条,还使用 Imgproc.HoughLinesP()
实现了 Houghlines,并尝试使用 Imgproc.lines()
突出显示线条,但输出没有成功。下面是我的代码,我还附上了我的输出图像。
请让我知道发生了什么问题以及应该做什么...
Mat initImg; // initial image
Mat greyImg; // converted to grey
Mat lines = new Mat();
int threshold = 50;
int minLineSize = 20;
int lineGap = 10;
initImg = Imgcodecs.imread(imgLoc, 1);
greyImg = new Mat();
Imgproc.cvtColor(initImg, greyImg, Imgproc.COLOR_BGR2GRAY);
Bitmap bitm = Bitmap.createBitmap(greyImg.cols(), greyImg.rows(),Bitmap.Config.ARGB_8888);
Imgproc.blur(greyImg, greyImg, new Size(3.d, 3.d));
Imgproc.adaptiveThreshold(greyImg, greyImg, 255, Imgproc.ADAPTIVE_THRESH_MEAN_C, Imgproc.THRESH_BINARY_INV, 15, 4);
Imgproc.HoughLinesP(greyImg, lines, 1, Math.PI/180, threshold,
minLineSize, lineGap);
// lines returns rows x columns and rows is always 1. I dont know why please help me to understand
for (int x = 0; x < lines.cols(); x++) {
double[] vec = lines.get(0, x);
double[] val = new double[4];
double x1 = vec[0],
y1 = vec[1],
x2 = vec[2],
y2 = vec[3];
System.out.println(TAG+"Coordinates: x1=>"+x1+" y1=>"+y1+" x2=>"+x2+" y2=>"+y2);
Point start = new Point(x1, y1);
Point end = new Point(x2, y2);
Imgproc.line(greyImg, start, end, new Scalar(0,255, 0, 255), 3);
}
Utils.matToBitmap(greyImg, bitm);
if(bitm!=null){
Toast.makeText(getApplicationContext(), "Bitmap not null", Toast.LENGTH_SHORT).show();
iv.setImageBitmap(bitm);
}else{
Toast.makeText(getApplicationContext(), "Bitmap null", Toast.LENGTH_SHORT).show();
}
我的输出:
我终于设法得到了 houghlines。 houghlines 没有显示在灰色图像中,我提取了灰色图像中的 houghlines 但绘制了彩色图像中的线条并且它起作用了。
Imgproc.HoughLinesP(greyImg, lines, 1, Math.PI/180, threshold,
minLineSize, lineGap);
for (int x = 0; x < lines.rows(); x++)
{
double[] vec = lines.get(x, 0);
double x1 = vec[0],
y1 = vec[1],
x2 = vec[2],
y2 = vec[3];
Point start = new Point(x1, y1);
Point end = new Point(x2, y2);
double dx = x1 - x2;
double dy = y1 - y2;
double dist = Math.sqrt (dx*dx + dy*dy);
if(dist>300.d) // show those lines that have length greater than 300
Imgproc.line(initImg, start, end, new Scalar(0,255, 0, 255),5);// here initimg is the original image.
}