Я пытался наложить изображение поверх прямоугольника, обнаруженного камерой. Я использую функцию, которая возвращает путь моего изображения с моей SD-карты (.jpg), но похоже, что он загружается неправильно, или, по крайней мере, я не могу отобразить его там, где я хочу.
Прежде всего, я проверяю, загружено ли изображение (и загружаю его, если это не так). Затем я продолжаю распознавать прямоугольники. После того, как я его узнаю, я предполагаю наложить этот прямоугольник на кадр с загруженным изображением, а затем вернуть в ImageView измененный кадр.
Я поделюсь с вами своим кодом из функции onCameraFrame («изображение» - это объект Mat, в котором я сохраняю загруженное изображение с моей SD-карты, а «img_path» - строка, в которой хранится путь к изображению):
Mat dst = inputFrame.rgba();
//Here I check if the image is loaded
if (image.empty()){
Log.v("Image","Empty!");
image = imread(img_path, CV_LOAD_IMAGE_UNCHANGED);
} else {
//If the image is loaded, then I proceed to process the frame.
Mat gray = inputFrame.gray();
pyrDown(gray, dsIMG, new Size(gray.cols() / 2, gray.rows() / 2));
Imgproc.pyrUp(dsIMG, usIMG, gray.size());
Imgproc.Canny(usIMG, bwIMG, 0, threshold);
Imgproc.dilate(bwIMG, bwIMG, new Mat(), new Point(-1, 1), 1);
List<MatOfPoint> contours = new ArrayList<MatOfPoint>();
cIMG = bwIMG.clone();
Imgproc.findContours(cIMG, contours, hovIMG, Imgproc.RETR_EXTERNAL, Imgproc.CHAIN_APPROX_SIMPLE);
for (MatOfPoint cnt : contours) {
MatOfPoint2f curve = new MatOfPoint2f(cnt.toArray());
Imgproc.approxPolyDP(curve, approxCurve, 0.02 * Imgproc.arcLength(curve, true), true);
int numberVertices = (int) approxCurve.total();
double contourArea = Imgproc.contourArea(cnt);
if (Math.abs(contourArea) < 100) {
continue;
}
//Rectangle detected
if (numberVertices >= 4 && numberVertices <= 6) {
List<Double> cos = new ArrayList<>();
for (int j = 2; j < numberVertices + 1; j++) {
cos.add(angle(approxCurve.toArray()[j % numberVertices], approxCurve.toArray()[j - 2], approxCurve.toArray()[j - 1]));
}
Collections.sort(cos);
double mincos = cos.get(0);
double maxcos = cos.get(cos.size() - 1);
if (numberVertices == 4 && mincos >= -0.3 && maxcos <= 0.5) {
Rect r = Imgproc.boundingRect(cnt);
image.copyTo(dst.submat(r));
Log.v("Test 1",Integer.toString(image.width()));
Log.v("Test 2",Integer.toString(image.height()));
}
}
}
}
return dst;
Я хочу видеть по прямоугольникам изображение, но я продолжаю смотреть на то же самое без изменений. Я получаю только один раз журнал «Пусто!», Поэтому он должен правильно прочитать изображение и сохранить его на своем коврике. Кроме того, в двух других журналах, где я записываю число строк и столбцов, я получаю число больше 0. Итак ...
Это правильный способ проверки правильности загрузки изображения?
У вас сейчас почему этот код не работает? Я также читал о функции addWeighted, но я попытался изменить размер меньшего изображения, и это не удалось.
Спасибо заранее !!
РЕДАКТИРОВАТЬ Это часть кода, где я распознаю прямоугольник, и мне нужно визуализировать новое изображение поверх прямоугольника на рамке:
//Rectangle detected
if (numberVertices >= 4 && numberVertices <= 6) {
List<Double> cos = new ArrayList<>();
for (int j = 2; j < numberVertices + 1; j++) {
cos.add(angle(approxCurve.toArray()[j % numberVertices], approxCurve.toArray()[j - 2], approxCurve.toArray()[j - 1]));
}
Collections.sort(cos);
double mincos = cos.get(0);
double maxcos = cos.get(cos.size() - 1);
if (numberVertices == 4 && mincos >= -0.3 && maxcos <= 0.5) {
Rect r = Imgproc.boundingRect(cnt);
image.copyTo(dst.submat(r));
Log.v("Test 1",Integer.toString(image.width()));
Log.v("Test 2",Integer.toString(image.height()));
}
}
Например, вы можете проверить следующее изображение с веб-страницы приложения InkHunter: https://i1.wp.com/goosed.ie/wp-content/uploads/2016/10/inkhunter-cover-for-tattoo-ideas-1.jpg?fit=800%2C450&ssl=1