2016-06-24 8 views
4

Я работаю с ситом с использованием OpenCV SDK для андроид
Я сталкиваюсь с трудностями при составлении матчей между двумя изображениями, используярисунка соответствует с использованием OpenCV для андроид

Feature2d.drawMatches()

всякий раз, когда я запустить приложение он проходит через все шаги, но прекратились при достижении функции розыгрыша.

Вот полный код:

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); 
    } 


    } 

мне также нужно знать, просеять, является ли лучшим выбором для использования обнаружения сложных объектов в режиме реального времени?

Edit 1: Я заметил, что в настоящее время я получаю следующие ошибки

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

вы получаете ошибка w а он останавливается? – Sunreef

+0

Да, на самом деле я заметил это сейчас, и я обновил вопрос с сообщением об ошибке –

ответ

1

Проблема решена:
ошибки я упомянул предотвращал изображение не отображались для некоторых Причина (возможно, разница свойств между изображением и изображением, которое мы хотим отобразить , допустим, размеры в некоторых случаях
на самом деле я не уверен в предисловии самоочевидными точки, но это было сказано там, и решение было установить вид изображения динамически изменяется в соответствии с изображением, но это не работает для меня)
Моя проблема была решена путем замены этих инструкций:

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

со следующим:

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); 

я фактически не получить разницу, так что дополнительная помощь, описывающая это будет настолько полезным, но надеюсь, что это может временно помочь людям с той же проблемой

 Смежные вопросы

  • Нет связанных вопросов^_^