1

几天前,我开始使用 Vuforia 库开发一个 android AR 应用程序。我可以将我的自定义图像覆盖在提供的 vuforia 示例应用程序中预定义的石头和芯片目标上。在 Cloud Reco 示例中,它识别目标图像并且我能够获取相同的元数据。我现在如何将我的自定义图像覆盖在这个识别的目标上?

在给定的用户定义目标示例中,它在运行时创建一个图像目标,并覆盖我的图像,但我希望它只覆盖在云识别的目标上。

  1. 所以我尝试将它集成到 CloudReco.java 中,这样当一个对象被云识别时,它会在运行时从中构建一个目标。

    @Override public void onVuforiaUpdate(State state) { // 获取跟踪管理器:TrackerManager trackerManager = TrackerManager.getInstance();

    // Get the object tracker:
    ObjectTracker objectTracker = (ObjectTracker) trackerManager
        .getTracker(ObjectTracker.getClassType());
    
    // Get the target finder:
    TargetFinder finder = objectTracker.getTargetFinder();
    
    // Check if there are new results available:
    final int statusCode = finder.updateSearchResults();
    
    // Show a message if we encountered an error:
    if (statusCode < 0)
    {
    
        boolean closeAppAfterError = (
            statusCode == UPDATE_ERROR_NO_NETWORK_CONNECTION ||
            statusCode == UPDATE_ERROR_SERVICE_NOT_AVAILABLE);
    
        showErrorMessage(statusCode, state.getFrame().getTimeStamp(), closeAppAfterError);
    
    } else if (statusCode == TargetFinder.UPDATE_RESULTS_AVAILABLE)
    {
        // Process new search results
        if (finder.getResultCount() > 0)
        {
            TargetSearchResult result = finder.getResult(0);
    
            // Check if this target is suitable for tracking:
            if (result.getTrackingRating() > 0)
            {
                Trackable trackable = finder.enableTracking(result);
    
                // Trying out the below method
                // ==================================================
    
                String targetMetaData = result.getMetaData();
                Log.d("TargetMetaData", targetMetaData);
    
                // Create the data set:
                dataSetUserDef = objectTracker.createDataSet();
    
                if (!objectTracker.activateDataSet(dataSetUserDef))
                {
                    Log.d(LOGTAG, "Failed to activate data set.");
                    return;
                }
    
                Log.d(LOGTAG, "Successfully loaded and activated data set.");
    
                // Build a target out of the selected image object
                ImageTargetBuilder targetBuilder = objectTracker
                        .getImageTargetBuilder();
    
                if (targetBuilder != null)
                {
                    if (targetBuilder.getFrameQuality() == ImageTargetBuilder.FRAME_QUALITY.FRAME_QUALITY_LOW)
                    {
                        Log.d("Cloud Reco", "Low Frame Quality");
                    }
    
                    String name;
                    if (!targetBuilder.build("randomName", 320.0f)) {
                        Log.d("CloudReco", "could not build target");
                    }
                }
    
                // ===================================================
    
                if (mExtendedTracking)
                    trackable.startExtendedTracking();
            }
        }
    } 
    

    }

但是我收到以下错误:`

03-10 08:17:15.330 291-28912/? D/ae_mgr: ae_mgr [doPvAEmonitor()][getPreviewFlare] i2FlareOffset = 27 i2FlareGain = 515 
03-10 08:17:15.339 28797-28882/com.vuforia.samples.VuforiaSamples I/AR: Successfully created ImageTarget.
03-10 08:17:15.340 291-28927/? D/MtkCam/MtkCamUtils: [queryRawStride]imgFmt(269), imgWidth(1632), stride(1640)
03-10 08:17:15.341 291-28927/? I/iio/ifunc: [_config] path(2),CQ(4),en1(0x40300000),en2(0x38a00003),dma(0x00280080),fmt(0x00000106),ctl(0x00010050),tcm_en(0x98100003),isIspOn(0x1),muxS2(0xc0080308)
03-10 08:17:15.341 291-28927/? I/MdpMgr: [init] +,cqIndex(4),sceID(8)
03-10 08:17:15.341 28797-28882/com.vuforia.samples.VuforiaSamples D/TargetMetaData: {"id":1,"image_url":"\/home\/lakshay\/repos\/barium-repos\/scormREPO\/3\/1\/mobile\/5wAhJHu04Ht_DX1600_DY1600_CX800_CY480.png5wAhJHu04Ht_DX1600_DY1600_CX800_CY480.png"}
03-10 08:17:15.343 28797-28882/com.vuforia.samples.VuforiaSamples I/AR: ObjectTracker: Successfully created dataset
03-10 08:17:15.344 291-28913/? D/flash_mgr_m.cpp: flash_mgr_m.cpp isAFLampOn 0
03-10 08:17:15.345 28797-28882/com.vuforia.samples.VuforiaSamples D/CloudReco: Successfully loaded and activated data set.
03-10 08:17:15.346 28797-28882/com.vuforia.samples.VuforiaSamples E/AR: Could not initiate UserDef Target build process
03-10 08:17:15.346 28797-28882/com.vuforia.samples.VuforiaSamples E/AR: Not in scanning state or invalid frame quality reading of -1. Call build() again in scanning mode with valid frame quality values.
03-10 08:17:15.346 28797-28882/com.vuforia.samples.VuforiaSamples D/CloudReco: could not build target
03-10 08:17:15.355 28797-28810/com.vuforia.samples.VuforiaSamples I/BufferQueueProducer: [SurfaceTexture--1-28797-1](this:0x8731e000,id:1,api:4,p:291,c:28797) queueBuffer: slot 1 is dropped, handle=0x854ba300
  1. 我还尝试调整 UserDefinedTargets.java,以便在构建图像目标之前,TargetFinder 检查对象是否与云目标匹配。但似乎这里的同一张图片不匹配。这是调整后的代码:

单击相机时:

// Button Camera clicked
public void onCameraClick(View v)
{
    if (isUserDefinedTargetsRunning())
    {
        // Shows the loading dialog
        loadingDialogHandler
            .sendEmptyMessage(LoadingDialogHandler.SHOW_LOADING_DIALOG);

        // Builds the new target
        //startBuild();

        //// Calling startBuild as an async task instead
        // since it involves network calls
        SyncIncoData syncIncoData = new SyncIncoData();
        syncIncoData.execute(new String[] { null });
    }
}

建设目标:

void startBuild()
{
    TrackerManager trackerManager = TrackerManager.getInstance();
    ObjectTracker objectTracker = (ObjectTracker) trackerManager
        .getTracker(ObjectTracker.getClassType());

    if (objectTracker != null)
    {
        ImageTargetBuilder targetBuilder = objectTracker
            .getImageTargetBuilder();
        if (targetBuilder != null)
        {
            if (targetBuilder.getFrameQuality() == ImageTargetBuilder.FRAME_QUALITY.FRAME_QUALITY_LOW)
            {
                 showErrorDialogInUIThread();
            }

            // Tried below code for cloud-reco on this object
            // ======================================================

            // Initialize target finder:
            TargetFinder targetFinder = objectTracker.getTargetFinder();

            // Start initialization:
            if (targetFinder.startInit(kAccessKey, kSecretKey))
            {
                Log.d("TargetFind", "init");
                targetFinder.waitUntilInitFinished();
            }

            Log.d("TargetFind", "init over");

            int resultCode = targetFinder.getInitState();
            if (resultCode != TargetFinder.INIT_SUCCESS)
            {
                if(resultCode == TargetFinder.INIT_ERROR_NO_NETWORK_CONNECTION)
                {
                    Log.d("TargetFinder", "no net");
                }
                else
                {
                    Log.d("TargetFinder", "no service");
                }

                Log.e(LOGTAG, "Failed to initialize target finder.");
                return;
            }

            Log.d("TargetFinder", "validated");

            // Get the target finder:
            TargetFinder finder = objectTracker.getTargetFinder();

            Log.d("TargetFinder", "found");
            // Check if there are new results available:
            final int statusCode = finder.updateSearchResults();

            Log.d("Status Code", String.valueOf(statusCode));
            //// status is coming 1 => TargetFinder.UPDATE_NO_REQUEST ////

            // Show a message if we encountered an error:
            if (statusCode < 0)
            {
                Log.d("CloudFind", "not found");
                return;
            }
            else if (statusCode == TargetFinder.UPDATE_RESULTS_AVAILABLE) {

                //// Not coming here ////

                Log.d("CloudFind", "found");
                // Process new search results
                if (finder.getResultCount() > 0) {
                    TargetSearchResult result = finder.getResult(0);
                    String targetMetaData = result.getMetaData();
                    Log.d("TargetMetaData", targetMetaData);

                    // Check if this target is suitable for tracking:
                    // Only if the target is matched and suitable for tracking
                    // then the Image target should be built
                    if (result.getTrackingRating() > 0) {
                        String name;
                        do
                        {
                            name = "UserTarget-" + targetBuilderCounter;
                            Log.d(LOGTAG, "TRYING " + name);
                            targetBuilderCounter++;
                        } while (!targetBuilder.build(name, 320.0f));

                        refFreeFrame.setCreating();
                    }
                }
            }


        }
    }
}

异步任务:

private class SyncIncoData extends AsyncTask<String, String, String> {


    @Override
    protected String doInBackground(String... ot) {

        startBuild();

        return null;
    }

    @Override
    protected void onPreExecute() {

        super.onPreExecute();

    }

    @Override
    protected void onPostExecute(String result) {


    }

    @Override
    protected void onProgressUpdate(String... values) {
        super.onProgressUpdate(values);
    }
}

PS:我愿意改变实现这一结果的方法。只需要将图像与我在 Vuforia web db 上的目标进行匹配,然后从另一台服务器获取图像以覆盖它。

4

0 回答 0