Android OpenCV Drawing Hough Lines
Я пытаюсь использовать OpenCV на телефоне Android для обнаружения строк. Я изменил "Tutorial 1 Basic - 2. Используйте образец камеры OpenCV". В качестве примера я также использую Hough Line Transform.
Тем не менее, я получаю странные цифры (по крайней мере, я считаю, что это странные числа) для очков. В диапазоне от 1000 до -1000 для b.
Я не совсем понимаю код (в основном часть о добавлении/вычитании 1000 * (a или -b)).
В конце концов, я не вижу строк вообще.
Может ли кто-нибудь дать мне руку? Также дайте мне знать, если вам нужна дополнительная информация.
capture.retrieve(mGray, Highgui.CV_CAP_ANDROID_GREY_FRAME);
Imgproc.Canny(mGray, mIntermediateMat, 80, 100);
Imgproc.HoughLines(mIntermediateMat, mLines, 1, Math.PI/180, 100);
Scalar color = new Scalar(0, 0, 255);
double[] data;
double rho, theta;
Point pt1 = new Point();
Point pt2 = new Point();
double a, b;
double x0, y0;
for (int i = 0; i < mLines.cols(); i++)
{
data = mLines.get(0, i);
rho = data[0];
theta = data[1];
a = Math.cos(theta);
b = Math.sin(theta);
x0 = a*rho;
y0 = b*rho;
pt1.x = Math.round(x0 + 1000*(-b));
pt1.y = Math.round(y0 + 1000*a);
pt2.x = Math.round(x0 - 1000*(-b));
pt2.y = Math.round(y0 - 1000 *a);
Core.line(mIntermediateMat, pt1, pt2, color, 3);
}
Imgproc.cvtColor(mIntermediateMat, mRgba, Imgproc.COLOR_GRAY2BGRA, 4);
Bitmap bmp = Bitmap.createBitmap(mRgba.cols(), mRgba.rows(), Bitmap.Config.ARGB_8888);
if (Utils.matToBitmap(mRgba, bmp))
return bmp;
bmp.recycle();
return null;
Ответы
Ответ 1
Я использую HoughLineP, чтобы найти строки в моем фрейме и отвлечь их.
Вот мой код... надеюсь, что это поможет.
Mat mYuv = new Mat();
Mat mRgba = new Mat();
Mat thresholdImage = new Mat(getFrameHeight() + getFrameHeight() / 2, getFrameWidth(), CvType.CV_8UC1);
mYuv.put(0, 0, data);
Imgproc.cvtColor(mYuv, mRgba, Imgproc.COLOR_YUV420sp2RGB, 4);
Imgproc.cvtColor(mRgba, thresholdImage, Imgproc.COLOR_RGB2GRAY, 4);
Imgproc.Canny(thresholdImage, thresholdImage, 80, 100, 3);
Mat lines = new Mat();
int threshold = 50;
int minLineSize = 20;
int lineGap = 20;
Imgproc.HoughLinesP(thresholdImage, lines, 1, Math.PI/180, threshold, minLineSize, lineGap);
for (int x = 0; x < lines.cols(); x++)
{
double[] vec = lines.get(0, x);
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);
Core.line(mRgba, start, end, new Scalar(255,0,0), 3);
}
Bitmap bmp = Bitmap.createBitmap(getFrameWidth(), getFrameHeight(), Bitmap.Config.ARGB_8888);
if (Utils.matToBitmap(mRgba, bmp))
return bmp;
Ответ 2
Вы рисуете линии к изображению mIntermediateMat
, но возвращаете изображение mRgba
. Вот почему вы не видите строки.
Диапазон -1000..1000 для b
правильный. HoughLines
возвращает угол линии и расстояние от нуля (a.k.a. rho и theta). Чтобы нарисовать их, вам нужно преобразовать их в два очка. 1000 - это размеры изображения, если вы рисуете изображение 2000x2000, увеличьте их до 2000 или иначе линии не пересекут все изображение.
HoughLines
- это другой алгоритм из HoughLinesP
. HoughLines
находит только линии, которые пересекают все изображение. HoughLinesP
возвращает более короткие сегменты линии.