I am tring to match multiple object using a single template .I succed to match only one object and this is the code but i don't know how to match multiple objects .I find a lot of resources but they are in c++ language and i need java code
public class MainActivity extends Activity { Button button; ImageView imageView; ImageView n3;
File cacheDir;
protected static final String TAG = "OpenCV";
private BaseLoaderCallback mLoaderCallBack = new BaseLoaderCallback(this) {
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
Log.i(TAG, "Open CV loaded successfully");
break;
default:
super.onManagerConnected(status);
break;
}
};
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
addListenerOnButton();
initDir();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
@Override
public void onResume() {
super.onResume();
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_1_0, this,mLoaderCallBack);
}
// ADDED THIS: to create/initialize external file
// Be sure write permissions is enabled in the manifest file
// ie add: <uses-permission android:name= "android.permission.WRITE_EXTERNAL_STORAGE"/>
public void initDir() {
if (android.os.Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED)) {
cacheDir = new File(
android.os.Environment.getExternalStorageDirectory(),"LazyList");
if (!cacheDir.exists()) {
cacheDir.mkdirs();
}
}
}
// added this to simplify creating full file path
public String getFileAbsPath(String fileName) {
File f = new File(cacheDir, fileName);
return f.getAbsolutePath();
}
public void addListenerOnButton() {
imageView = (ImageView) findViewById(R.id.imageView1);
n3 = (ImageView) findViewById(R.id.imageView2);
button = (Button) findViewById(R.id.button1);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
String infile = "/storage/emulated/0/DCIM/Camera/n2.png";
String tp = "/storage/emulated/0/DCIM/Camera/n1.png";
String outFile = "/storage/emulated/0/DCIM/Camera/n3.png";
try {
matchTemplate(infile, tp, outFile, Imgproc.TM_CCOEFF);
Bitmap bm = BitmapFactory.decodeFile(outFile);
n3.setImageBitmap(bm);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
}
});
}
public Mat matchTemplate(String inFile, String templateFile,String outFile, int match_method) {
Log.i(TAG, "Running Template Matching");
Mat img = Imgcodecs.imread(inFile);
Mat templ = Imgcodecs.imread(templateFile);
// / Create the result matrix
int result_cols = img.cols() - templ.cols() + 1;
int result_rows = img.rows() - templ.rows() + 1;
Mat result = new Mat(result_rows, result_cols, CvType.CV_32FC1);
// Bitmap inFileBitmap = BitmapFactory.decodeFile(inFile);
// Bitmap templBitmap = BitmapFactory.decodeFile(templateFile);
// / Do the Matching and Normalize
//Utils.bitmapToMat(inFileBitmap, img);
//Utils.bitmapToMat(templBitmap, templ);
Imgproc.matchTemplate(img, templ, result, match_method);
Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());
// / Localizing the best match with minMaxLoc
MinMaxLocResult mmr = Core.minMaxLoc(result);
Point matchLoc;
double minVal; double maxVal;
if (match_method == Imgproc.TM_SQDIFF
|| match_method == Imgproc.TM_SQDIFF_NORMED) {
matchLoc = mmr.minLoc;
} else {
matchLoc = mmr.maxLoc;
}
// / Show me what you got
Imgproc.rectangle(img, matchLoc, new Point(matchLoc.x + templ.cols(),matchLoc.y + templ.rows()), new Scalar(0, 0,0));
// Save the visualized detection.
Log.i(TAG, "Writing: " + outFile);
Imgcodecs.imwrite(outFile, img);
return img;
}
}