2016-06-24 1 views
4

Je travaille avec EIPD en utilisant OpenCV sdk pour Android
Je suis face à des difficultés dans l'élaboration des correspondances entre deux images en utilisant ledessin correspondant à l'aide OpenCV pour android

Feature2d.drawMatches()

chaque fois que je lance l'application, il passe par toutes les étapes mais s'est arrêté en atteignant la fonction de tirage.

Voici le code complet:

public class MainActivity extends AppCompatActivity { 
static { 
    System.loadLibrary("opencv_java"); 
    System.loadLibrary("nonfree"); 
} 

private ImageView imageView; 

private FeatureDetector detector = FeatureDetector.create(FeatureDetector.SIFT); 
DescriptorExtractor descriptorExtractor=DescriptorExtractor.create(DescriptorExtractor.SIFT); 
DescriptorMatcher descriptorMatcher= DescriptorMatcher.create(3); 

Bitmap inputImage; 
Bitmap inputImage2; 
Bitmap out; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 


    if(OpenCVLoader.initDebug()){ 
     Toast.makeText(this,"Hiii",Toast.LENGTH_SHORT).show();} 

    inputImage = BitmapFactory.decodeResource(getResources(), R.drawable.object); 
    inputImage2 = BitmapFactory.decodeResource(getResources(), R.drawable.objecttest); 
    out = BitmapFactory.decodeResource(getResources(), R.drawable.test); 
    imageView = (ImageView) this.findViewById(R.id.imageView); 
    sift(); 
} 
public void onResume() { 
    super.onResume(); 
} 


public void sift() { 

    Mat rgba = new Mat(); 
    Mat rgba2 = new Mat(); 
    Mat desc=new Mat(); 
    Mat desc2=new Mat(); 
    MatOfDMatch matches=new MatOfDMatch(); 
    Mat output=new Mat(); 

    Utils.bitmapToMat(inputImage, rgba); 
    Utils.bitmapToMat(inputImage2, rgba2); 
    Utils.bitmapToMat(out, output); 

    MatOfKeyPoint keyPoints = new MatOfKeyPoint(); 
    MatOfKeyPoint keyPoints2 = new MatOfKeyPoint(); 

    Imgproc.cvtColor(rgba, rgba, Imgproc.COLOR_RGBA2GRAY); 
    Imgproc.cvtColor(rgba2, rgba2, Imgproc.COLOR_RGBA2GRAY); 

    detector.detect(rgba, keyPoints); 
    detector.detect(rgba2, keyPoints2); 

    descriptorExtractor.compute(rgba,keyPoints,desc); 
    descriptorExtractor.compute(rgba2,keyPoints2,desc2); 
    descriptorMatcher.match(desc,desc2,matches); 

    Features2d.drawMatches(rgba,keyPoints,rgba2,keyPoints2,matches,output); 
     Utils.matToBitmap(output, out); 
     imageView.setImageBitmap(out); 
    } 


    } 

Je dois aussi savoir si EIPD est le meilleur choix pour l'utilisation de la détection d'objets complexes en temps réel?

Modifier 1: Je remarque maintenant que je reçois les erreurs suivantes

OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows)

Fatal signal 11 (SIGSEGV), code 2, fault addr 0x12ce08e0 in tid 9971

+0

est-ce que vous obtenez une erreur w Puis-je arrêter? – Sunreef

+0

oui en fait je l'ai remarqué maintenant, et j'ai mis à jour la question avec le message d'erreur –

Répondre

1

Problème résolu:
l'erreur que je l'ai mentionné empêchait l'image d'être affichée pour certains raison (peut-être la différence de propriétés entre le point de vue de l'image et l'image que nous voulons afficher disons que les dimensions dans certains cas
en fait je ne suis pas sûr de la pré le point Vious, mais il a été mentionné là-bas, et la solution était de définir l'affichage d'image à redimensionné dynamiquement en fonction de l'image, mais cela ne fonctionne pas pour moi)
Mon problème a été résolu en remplaçant les instructions suivantes:

Features2d.drawMatches(rgba,keyPoints,rgba2,keyPoints2,matches,output); 
Utils.matToBitmap(output, out); 
imageView.setImageBitmap(out); 

ce qui suit:

Scalar RED = new Scalar(255,0,0); 
Scalar GREEN = new Scalar(0,255,0); 
MatOfByte drawnMatches = new MatOfByte(); 
Features2d.drawMatches(rgba,keyPoints,rgba2,keyPoints2,matches,output,GREEN, RED, drawnMatches, Features2d.NOT_DRAW_SINGLE_POINTS); 

Bitmap imageMatched = Bitmap.createBitmap(output.cols(), output.rows(), Bitmap.Config.RGB_565);//need to save bitmap 
Utils.matToBitmap(output, imageMatched); 
imageView.setImageBitmap(imageMatched); 

J'ai eu pas vraiment la différence, si une aide supplémentaire décrivant ce sera si utile, mais espérons que cela peut aider temporairement les personnes ayant le même problème