У меня есть проект Android, и у меня возникают проблемы с решением этой проблемы. Затем приложение передаст изображение растрового изображения на функцию, в которой оно будет предварительно обработано (в частности, изображение будет изменено), а затем растровая карта изменения будет отправлено на функцию, в которой изображение растрового изображения будет затем преобразовано в объект Mat и отправлено на функцию ASYNCTAST-вызванной (с помощью объекта MAT изображения Bitmap в виде параметра).
У меня есть проект Android, и у меня возникают проблемы с решением этой проблемы. Затем приложение передаст изображение растрового изображения на функцию, в которой оно будет предварительно обработано (в частности, изображение будет изменено), а затем растровая карта изменения будет отправлено на функцию, в которой изображение растрового изображения будет затем преобразовано в объект Mat и отправлено на функцию ASYNCTAST-вызванной (с помощью объекта MAT изображения Bitmap в виде параметра).[code]public void processImage(final Bitmap bmp) { class ProcessImage extends AsyncTask //This AsyncTask triggers the function matchAndCompare(). { Mat srcImage = new Mat(bmp.getWidth(), bmp.getHeight(), CvType.CV_8UC4, new Scalar(4)); protected void onPreExecute() { super.onPreExecute(); plsWait = ProgressDialog.show(CameraView.this, "Dur-Yan!", "Please wait. Processing image. " + "Patience is appreciated since it will definitely pass."); } @Override protected Void doInBackground(Bitmap... bitmaps) { matchAndCompare(srcImage); //The function where the main processing and matching takes place. return null; } protected void onPostExecute(Void result) { super.onPostExecute(result); plsWait.dismiss(); runOnUiThread(new Runnable() { public void run() { Utils.matToBitmap(srcImage, bmp); imgPreview.setImageBitmap(bmp); forUpload(srcImage, bmp); } }); } } ProcessImage process = new ProcessImage(); process.execute(bmp); } < /code> И это функция, в которой происходит обработка основной обработки изображений. Эта функция обнаружит клавиатуры и вычислит дескрипторы для исходного изображения. Затем он пройдет (запрос) записи в базе данных, получает каждое изображение растрового изображения, преобразует каждый из них в объекты Mat, обнаруживает клавиши, вычисляет дескрипторы, затем сохранит дескрипторы для каждого из изображений. < /P> public void matchAndCompare (Mat source) { //Initialize minimum and maximum threshold int MIN_MATCH_THRESHOLD = 10; int MAX_MATCH_THRESHOLD = 250;
//Initialize MatOfDMatch MatOfDMatch matches = new MatOfDMatch(); MatOfDMatch goodMatches = new MatOfDMatch();
//Initialize good matches list LinkedList listOfGoodMatches = new LinkedList();
//Initialize object lists LinkedList refObjectList = new LinkedList(); LinkedList srcObjectList = new LinkedList();
Log.e(TAG, "Source image channels: " + source.channels()); //Pre-process source image and compute for keypoints Imgproc.cvtColor(source, source, Imgproc.COLOR_RGB2GRAY, 4); MatOfKeyPoint srcKeyPoints = createDetector(source); Mat srcDescriptors = extractDescription(srcKeyPoints, source); MatOfPoint2f srcPoint2f = new MatOfPoint2f(); //Features2d.drawKeypoints(source, srcKeyPoints, source);
//Retrieve images from online database, pre-process and compute for keypoints String result = null; InputStream is = null; int i = 0; if (connected == true) { try { HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url_retrieve_images); HttpResponse response = httpclient.execute(httppost); HttpEntity entity = response.getEntity(); is = entity.getContent();
//parse json data ArrayList imgs = new ArrayList(); try { JSONArray jArray = new JSONArray(result); for (i = 0; i < jArray.length(); i++) { // Obtain images from MySQL database, stream them as Bitmap, and convert them to Mat. JSONObject json_data = jArray.getJSONObject(i); Images images = new Images(); images.setImage_Name(json_data.getString("image_name")); imgs.add(images); String ImgLoc = "http://duryan-itp.host56.com/uploads/" + images.getImage_Name();
//Bitmap referenceImg = BitmapFactory.decodeStream(new java.net.URL(ImgLoc).openStream()); Mat refImage = new Mat(ImageFromURL(ImgLoc).getWidth(), ImageFromURL(ImgLoc).getHeight(), CvType.CV_8UC4, new Scalar(4)); Log.i(TAG, "Successfully converted " + ImgLoc + " to Mat()");
//Pre-process reference image and compute for keypoints Log.e(TAG, "Reference image channels: " + refImage.channels()); Imgproc.cvtColor(refImage, refImage, Imgproc.COLOR_RGB2GRAY, 4); MatOfKeyPoint refKeyPoints = createDetector(refImage); Mat refDescriptors = extractDescription(refKeyPoints, refImage); MatOfPoint2f refPoint2f = new MatOfPoint2f(); //Features2d.drawKeypoints(refImage, refKeyPoints, refImage);
// Apply brute-force matching Log.i(TAG, "Image matching in progress...\n" + "Matching image with template: " + images.getImage_Name()); Log.e(TAG, srcDescriptors.toString()); Log.e(TAG, refDescriptors.toString()); if (srcDescriptors.empty()) { Log.e(TAG, "Source descriptor array is empty!"); finish(); break; } else if (refDescriptors.empty()) { Log.e(TAG, "Reference descriptor array is empty!"); finish(); break; } else if (srcDescriptors.empty() && refDescriptors.empty()) { Log.e(TAG, "Both descriptor arrays are empty!"); finish(); break; } else { matcher.match(srcDescriptors, refDescriptors, matches);
//Initialize match list double max_dist = 0; double min_dist = 100; List matchesList = matches.toList();
for (int r = 0; r < refDescriptors.rows(); r++) { Double distance = (double) matchesList.get(r).distance; if (distance < min_dist) { min_dist = distance; } if (distance > max_dist) { max_dist = distance; } }
for (int s = 0; s < refDescriptors.rows(); s++) { if (matchesList.get(i).distance < 3 * min_dist) { listOfGoodMatches.add(matchesList.get(s)); } }
goodMatches.fromList(listOfGoodMatches);
List refObjectListKeypoints = refKeyPoints.toList(); List srcObjectListKeypoints = srcKeyPoints.toList();
for (int t = 0; t < listOfGoodMatches.size(); t++) { refObjectList.addLast(refObjectListKeypoints.get(listOfGoodMatches.get(t).queryIdx).pt); srcObjectList.addLast(srcObjectListKeypoints.get(listOfGoodMatches.get(t).trainIdx).pt); }