【问题标题】:Calling image in imageView distory the resultant image在 imageView 中调用图像会破坏生成的图像
【发布时间】:2014-10-30 22:07:58
【问题描述】:

我正在使用带有 OpenCV 的 Android NDK。 我有两个输入图像作为输入和一个输出图像。 第一个输入图像只是普通图像,第二个是晕影。

我从 java 端收到某种逻辑错误。

下面是我的java代码:

public void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

         imageview_1=(ImageView) findViewById(R.id.imageView1);
         imageview_2=(ImageView) findViewById(R.id.imageView2);

        InputStream is , Vign;
        is = this.getResources().openRawResource(R.drawable.me);
        final Bitmap bmInImg = BitmapFactory.decodeStream(is);
        Vign = this.getResources().openRawResource(R.drawable.p);
        final Bitmap bmInImg2 = BitmapFactory.decodeStream(Vign);

        mPhotoIntArray = new int[bmInImg.getWidth() * bmInImg.getHeight()];
        nPhotoIntArray = new int[bmInImg.getWidth() * bmInImg.getHeight()];
        vPhotoIntArray = new int[bmInImg2.getWidth() * bmInImg2.getHeight()];
        imageview_1.setImageBitmap(bmInImg);
        // Copy pixel data from the Bitmap into the 'intArray' array
        bmInImg.getPixels(mPhotoIntArray, 0, bmInImg.getWidth(), 0, 0, bmInImg.getWidth(), bmInImg.getHeight());
        bmInImg2.getPixels(vPhotoIntArray, 0, bmInImg2.getWidth(), 0, 0, bmInImg2.getWidth(), bmInImg2.getHeight());

        mCannyOutArray = new int[bmInImg2.getWidth() * bmInImg2.getHeight()];
        final Bitmap bmOutImg = Bitmap.createBitmap(bmInImg2.getWidth(), bmInImg2.getHeight(), Config.ARGB_8888);  
        bmOutImg.setPixels(mCannyOutArray, 0, bmInImg2.getWidth(), 0, 0, bmInImg2.getWidth(), bmInImg2.getHeight());

        Button button= (Button) findViewById(R.id.NextButton);
        button.setOnClickListener(new OnClickListener() {

            @Override
        public void onClick(View v)  {  

                if (count ==0)
                {
                    Vig(bmInImg.getHeight(),bmInImg.getWidth(),bmInImg2.getHeight(),bmInImg2.getWidth(), mPhotoIntArray,vPhotoIntArray, mCannyOutArray); 

                    bmOutImg.setPixels(mCannyOutArray, 0, bmInImg2.getWidth(), 0, 0, bmInImg2.getWidth(), bmInImg2.getHeight());    
                    imageview_2.setImageBitmap(bmOutImg);        
                }

                count++;        
            }
            }); 

        String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
        String outFileName = extStorageDirectory + "/me.png";
        OutputBitmapToFile(bmOutImg, outFileName);      
    }

上面的代码给了我很好的小插图作为输出,但是第一张图片在所有图像上都显示了衬里,当我添加两个图像时,小插图看起来很好但是小插图内的图像(image1)充满了线条,如果我更改代码bmOutImg.setPixels 从外部和内部条件if

Vig(bmInImg.getHeight(),bmInImg.getWidth(),bmInImg2.getHeight(),bmInImg2.getWidth(), mPhotoIntArray,vPhotoIntArray, mCannyOutArray); 

bmOutImg.setPixels(mCannyOutArray, 0, bmInImg.getWidth(), 0, 0, bmInImg.getWidth(), bmInImg.getHeight());   
                        imageview_2.setImageBitmap(bmOutImg);

然后它在晕影图像上显示衬里。我的mCannyOutArray 应该是什么,这样当我添加 vig+image1 时,我的两个图像都能为我的输出提供令人满意的结果

维格是:

而 img1 是:

输出:

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#000000"
    android:orientation="vertical" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:contentDescription="@null" />

    <ImageView
        android:id="@+id/imageView2"
        android:layout_width="235dp"
        android:layout_height="208dp"
        android:layout_weight="0.10"
        android:contentDescription="@null" />

</LinearLayout>

【问题讨论】:

  • 俗话说,一张图片胜过千言万语。
  • 我用图片更新
  • 带有“lining”的输出图像呢?
  • vigimg1 的尺寸相同时是否还会出现问题?
  • 嘿@karlphillip 很高兴在我的问题上见到你,我只是在阅读你的答案,是的,如果我们使用img1 输出尺寸,输出将不会显示vig

标签: java android eclipse opencv image-processing


【解决方案1】:

首先,您需要确定问题出在哪里

  • 是否与您实施的晕影过滤器有关?
  • 或者是图像在屏幕上的显示方式?

为了在这方面为您提供帮助,请确保 vigimg1 在进行任何处理之前具有相同的尺寸。将这些图像保存到磁盘并检查它们的宽度/高度值。

然后执行您的过滤器,并将输出图像保存到硬盘上,然后再显示在屏幕上。如果保存的图像看起来不错,那么您肯定知道问题出在图像的显示方式上。

不久前我实现了一个vignette filter using C++ and OpenCV,您可以查看源代码并将其与您正在执行的操作进行比较。这是一个例子:

输入:

输出:

【讨论】:

  • 是的,这个答案也在我的问题上,但这里的场景不同,小插图图像是 photoshop 的单独 4 通道图像,我正在尝试使用这里的逻辑 stackoverflow.com/questions/23801988/… 来实现它,我在上面提到的 java 端发现了问题,因为我的jni code of c++ 工作正常,但是如何调整两个位图的大小?首先将它们转换为 Mat ?在java中,这些过滤器在windows上对我有用,我在android中遇到问题
  • 对不起,由于我缺乏 JNI 经验,无法进一步帮助您。如果我是你,我会查看用于存储图像的数据类型文档,看看它是否提供了调整图像大小的方法。
  • 这两个图像的逻辑对我来说应该是相同大小的,我只是通过使用两个相同大小的图像手动完成的,现在我进一步检查如何在 java 中调整两个图像的大小,谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-11
  • 1970-01-01
  • 2022-11-08
  • 2015-12-04
相关资源
最近更新 更多