4

統合テスト中に 2 つの画像の違いを特定しようとしています。Web でいくつかの調査を行った後、MarvinProject に出くわし、それを使用してUnitTestを作成しようとしました。以下を参照してください。

私がプラグインを理解している限り、それは違いを含む領域でDifferentRegions渡されたものを埋めます。ImageMask differenceMaskテストに渡す 2 つの画像は異なるため、何かが出力されるはずです。

残念ながらそうではありません。

これらの 2 つのイメージをバイト単位で比較し、それらが成功する他のテストを作成しました。この問題を試してみたい方のために、GitHub にリポジトリを作成しました。ここに ImageCompareTestがあります。

@Test
public void tryMarvinProject() {
    // init images
    String root = "src/test/resources/";
    MarvinImage assertedImg = MarvinImageIO.loadImage(root + "image1.bmp");
    MarvinImage actualImg = MarvinImageIO.loadImage(root + "image2.bmp");

    // init diff-regions plugin
    DifferentRegions regions = new DifferentRegions();
    regions.load();
    regions.setAttribute("comparisonImage", assertedImg);

    int width = assertedImg.getWidth();
    int height = assertedImg.getHeight();
    int type = assertedImg.getType();

    // process the images and retrieve differences from the ImageMask
    MarvinImageMask differenceMask = new MarvinImageMask();
    regions.process(
            actualImg,
            new MarvinImage(new BufferedImage(width, height, type)),
            new MarvinAttributes(),
            differenceMask,
            false);

    // should contain the differences, but does not
    System.out.println(differenceMask.getMaskArray());
    assertNotNull(differenceMask.getMaskArray());
}
4

1 に答える 1

4

プラグイン DifferentRegions は、リアルタイムのビデオ処理用に開発されました。アイデアは、この例に示すように、一連のビデオ フレームで変化しているシーン内の領域を見つけることです。

画像同士の比較には、DifferenceColorプラグインを試す必要があります。基本的に、同じ位置にあるピクセルの色強度を分析して 2 つの画像を比較します。指定された 2 つのピクセルの差がcolorRange属性よりも大きい場合、2 つのピクセルは色が異なると見なされます。プラグインは、異なるピクセルを異なる色でレンダリングして、出力画像に表示します。process(...)メソッドでMarvinAttributesオブジェクトを渡すと、キーtotalに格納されているさまざまなピクセルの数を取得できます。

例:

    MarvinAttributes attrOut = new MarvinAttributes();
    MarvinImagePlugin diff = MarvinPluginLoader.loadImagePlugin("org.marvinproject.image.difference.differenceColor");
    diff.process(imageA, imageB, attrOut);
    System.out.println("Distinct pixels:"+attrOut.get("total"));

PS: MarvinPluginLoaderを使用するには、ここに記載されている手順に従って開発環境を構成する必要があります。


ただし、単体テストに画像比較を使用しようとしているため、MarvinTestCaseクラスを確認する必要があります。JUnit TestCase を拡張し、MarvinImage オブジェクトを比較するメソッドを提供します。

入力:

ここに画像の説明を入力

以下のソース コードは、imageA と imageB を比較するテスト ケースと、imageA と imageC を比較するテスト ケースの 2 つのテスト ケースを実装しています。

import marvin.image.MarvinImage;
import marvin.io.MarvinImageIO;
import marvin.test.MarvinTestCase;

public class UnitTesting extends MarvinTestCase {

    private MarvinImage imageA, imageB, imageC;

    public UnitTesting(){
        imageA = MarvinImageIO.loadImage("./res/penguin.jpg");
        imageB = MarvinImageIO.loadImage("./res/penguin.jpg");
        imageC = MarvinImageIO.loadImage("./res/penguin_dark.jpg");
    }

    public void testSameImage(){
        assertEquals(imageA, imageB);
    }

    public void testDistinctImages(){
        assertEquals(imageA, imageC);
    }
}

Eclipse または別の IDE を使用して、上記のクラスを JUnit テストとして実行します。Eclipse の [JUnit] タブの出力の下。

ここに画像の説明を入力

于 2014-03-15T16:10:19.297 に答える