当前位置: 首页 > 知识库问答 >
问题:

OnClickListener未显示我的函数的输出

徐佐
2023-03-14

我做了2个函数,一个函数是给图像增加亮度,第二个函数是将图像转换为灰度,下面是我的jni代码(我正在使用android和eclipse)

int toGray(Mat mSrc, Mat& bgra);
int tobrightness(Mat mSrc, Mat& bgra);

extern "C" {

JNIEXPORT jint JNICALL Java_org_opencv_samples_NativeActivity_CvNativeActivity_grayimg(JNIEnv* env, jobject,jint width, jint height, jintArray in, jintArray out)
   {
       jint* _in = env->GetIntArrayElements(in, 0);
       jint* _out = env->GetIntArrayElements(out, 0);

       Mat mSrc(height, width, CV_8UC4, (unsigned char*)_in);
       Mat bgra(height, width, CV_8UC4, (unsigned char*)_out);

       int conv;
       jint retVal;
       conv = toGray(mSrc ,bgra);
       retVal = (jint)conv;

       env->ReleaseIntArrayElements(in, _in, 0);
       env->ReleaseIntArrayElements(out, _out, 0);
       return retVal;

   }
}


JNIEXPORT jint JNICALL Java_org_opencv_samples_NativeActivity_CvNativeActivity_eqhist(JNIEnv* env, jobject,jint width, jint height, jintArray in, jintArray out)
   {
       jint* _in = env->GetIntArrayElements(in, 0);
       jint* _out = env->GetIntArrayElements(out, 0);

       Mat mSrc(height, width, CV_8UC4, (unsigned char*)_in);
       Mat bgra(height, width, CV_8UC4, (unsigned char*)_out);
       Mat bgr(height, width, CV_8UC3);
       int conv;
       jint retVal;
       conv = tobrightness(mSrc, bgra);
       retVal = (jint)conv;

       env->ReleaseIntArrayElements(in, _in, 0);
       env->ReleaseIntArrayElements(out, _out, 0);
       return retVal;

}
int tobrightness(Mat mSrc, Mat& bgra)
{
    vector<Mat> sChannels;
    split(mSrc, sChannels);

    for(int i=0; i<sChannels.size(); i++)
    {
        Mat channel = sChannels[i];
        equalizeHist(channel, channel);
    }
    merge(sChannels, bgra);
    return 1;
}

int toGray(Mat mSrc, Mat& bgra)
{
    Mat gray(mSrc.rows, mSrc.cols, CV_8UC1);
    cvtColor(mSrc , gray , CV_BGRA2GRAY);
    cvtColor(gray , bgra , CV_GRAY2BGRA);
    return 1;
}

在一个cpp文件中调用它两次/三次或多次jni方法,像上面我做的那样,可以吗?因为我想,如果我点击一个按钮,它应该执行亮度功能,当我点击第二个按钮时,它应该执行灰度,那么我是否正确地使用上述cpp进行此场景?

下面是我的java代码:

public class CvNativeActivity extends Activity
{
    public native int eqhist(int width, int height, int [] mPhotoIntArray, int [] mCannyOutArray);
    public native int grayimg(int width, int height, int [] mPhotoIntArray, int [] mCannyOutArray);

    static 
    {
        System.loadLibrary("native_activity");
        Log.i("EqActivity", "native library loaded successfully");
    }
    /** Called when the activity is first created. */ 
    ImageView imageview_1;
    ImageView imageview_2;

    @Override
    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;
        is = this.getResources().openRawResource(R.drawable.me);
        Bitmap bmInImg = BitmapFactory.decodeStream(is);

        int [] mPhotoIntArray;
        int [] mCannyOutArray;

        mPhotoIntArray = new int[bmInImg.getWidth() * bmInImg.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());

        //create the Brightness result buffer
        mCannyOutArray = new int[bmInImg.getWidth() * bmInImg.getHeight()];


        eqhist(bmInImg.getHeight(), bmInImg.getWidth(), mPhotoIntArray, mCannyOutArray);
        grayimg(bmInImg.getHeight(), bmInImg.getWidth(), mPhotoIntArray, mCannyOutArray);

        //
        // Convert the result to Bitmap
        //
        Bitmap bmOutImg = Bitmap.createBitmap(bmInImg.getWidth(), bmInImg.getHeight(), Config.ARGB_8888);  
        bmOutImg.setPixels(mCannyOutArray, 0, bmInImg.getWidth(), 0, 0, bmInImg.getWidth(), bmInImg.getHeight());


        imageview_2.setImageBitmap(bmOutImg);
        String extStorageDirectory = Environment.getExternalStorageDirectory().toString();
        String outFileName = extStorageDirectory + "/me.png";

        OutputBitmapToFile(bmOutImg, outFileName);   
    }
}
void OutputBitmapToFile(Bitmap InBm, String Filename)
    {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        InBm.compress(Bitmap.CompressFormat.PNG, 100, bytes);

        File f = new File(Filename);
        try
        {
            f.createNewFile();
            //write the bytes in file
            FileOutputStream fo = new FileOutputStream(f);
            fo.write(bytes.toByteArray());

        } 
        catch (Exception e) 
        {
            e.printStackTrace();
        }           
    }
}

以上代码工作正常,显示eqhist方法的输出

但是通过按钮点击调用功能(我在上面的代码中调整了下面的代码,没有错误,但没有显示输出):

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

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                eqhist(bmInImg.getHeight(), bmInImg.getWidth(), mPhotoIntArray, mCannyOutArray);

            }
        });

错误:

08-05 00:42:21.656: E/ActivityManager(360): writeStringToFile error: /sys/kernel/debug/tracing/tracing_enabled java.io.FileNotFoundException: /sys/kernel/debug/tracing/tracing_enabled: open failed: ENOENT (No such file or directory)
08-05 00:57:56.150: E/ActivityManager(360): ANR in org.opencv.samples.NativeActivity (org.opencv.samples.NativeActivity/.CvNativeActivity)
08-05 00:57:56.150: E/ActivityManager(360): Reason: keyDispatchingTimedOut
08-05 01:18:16.986: E/Trace(20443): error opening trace file: No such file or directory (2)

编辑:

主要的xml

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

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

    <ImageView
        android:id="@+id/imageView2"
        android:contentDescription="@null"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:layout_alignParentBottom="true"
        android:layout_centerHorizontal="true" />

 <Button
     android:id="@+id/NextButton"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content"
     android:layout_alignBottom="@+id/imageView1"
     android:layout_alignParentRight="true"
     android:layout_marginRight="21dp"
     android:text="@string/Next_Button" />

</RelativeLayout>

共有2个答案

狄兴业
2023-03-14

你不需要做两次。你可以打一个电话。

extern "C" {

JNIEXPORT jint JNICALL Java_org_opencv_samples_NativeActivity_CvNativeActivity_grayimg(JNIEnv* env, jobject,jint width, jint height, jintArray in, jintArray out)
   {
       // process
   }

JNIEXPORT jint JNICALL Java_org_opencv_samples_NativeActivity_CvNativeActivity_eqhist(JNIEnv* env, jobject,jint width, jint height, jintArray in, jintArray out)
   {
       // process
   }
}
int tobrightness(Mat mSrc, Mat& bgra)
{
    // process
}

int toGray(Mat mSrc, Mat& bgra)
{
    // process
}

现在,在您的CvNativeActivity中,您需要定义以下函数。

public native int grayimg(int w, int h, int[] in, int[] out);
public native int eqhist(int w, int h, int[] in, int[] out);

似乎在将位图写入时出错。png文件。使用函数OutputBitmapToFile更新您的问题。

另一种可能的解决方案是在新线程中调用此函数

public class ProcessTask extends AsyncTask<Void, Void, Boolean> {

    @Override
    protected Boolean doInBackground() {
        // this happens in a background thread
        eqhist(bmInImg.getHeight(), bmInImg.getWidth(), mPhotoIntArray, mCannyOutArray);
    }

    @Override
    protected void onPostExecute(Boolean result) {
        // save image, show image etc
        // This happens on the UI thread
    }
}

还有你的onClick电话,

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

            @Override
            public void onClick(View v) {
                 ProcessTask task = new ProcessTask();
                 task.execute();

            }
        })
邬弘化
2023-03-14

正如我在评论中所说,您在java文件中几乎没有出错,您的其他文件都很好,您没有将结果放在按钮单击上,因此按钮没有任何显示(没有图像视图),您的输出位图在按钮单击之外,您的位图在按钮单击时没有任何显示,将这些行放在按钮单击内

Bitmap bmOutImg = Bitmap.createBitmap(bmInImg.getWidth(), bmInImg.getHeight(), Config.ARGB_8888);  
bmOutImg.setPixels(mCannyOutArray, 0, bmInImg.getWidth(), 0, 0, bmInImg.getWidth(), bmInImg.getHeight());   
imageview_2.setImageBitmap(bmOutImg);

我在android上测试时,下面的代码对我有效,但速度有点慢:

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

    @Override
public void onClick(View v)  {
        // TODO Auto-generated method stub
        Log.i("APP: ", "Into OnClick of SettingDialog. View = " + v);
        eqhist(bmInImg.getHeight(),bmInImg.getWidth(), mPhotoIntArray, mCannyOutArray); 
        Bitmap bmOutImg = Bitmap.createBitmap(bmInImg.getWidth(), bmInImg.getHeight(), Config.ARGB_8888);  
        bmOutImg.setPixels(mCannyOutArray, 0, bmInImg.getWidth(), 0, 0, bmInImg.getWidth(), bmInImg.getHeight());   
        imageview_2.setImageBitmap(bmOutImg);


    }
    });
 类似资料:
  • 我正在尝试构建一个简单的Web应用程序,它接受大量的二进制输入,并计算一个布尔公式,然后输出。我做错了什么? null null

  • 这是我的测试代码,但我有一个更详细的代码——但它们都不起作用。在python 3. x中。 编辑:这就是我想使用的终端(和语法错误-同样的问题):

  • 这是我的代码,创建一个应用程序,显示下一个图像时,点击,我有麻烦创建一个动态显示,它崩溃的点击图像。 java文件:

  • 问题内容: 将Docker for Mac 1.13.1与以下Dockerfile一起使用: 使用以下内容的contab文件: 当我使用以下命令构建和运行它时: 我看到输出: 如果我等待一分钟,则不会出现输出。但是,如果我登录到正在运行的容器并拖尾文件,则可以看到内容: 我尝试在CMD的末尾添加另一个回显,以查看是否只是吞没了STDOUT的最后一个命令,但这没有帮助。 我已经将代码发布在githu

  • 我需要一种方法来为未知数量的按钮创建OnClickListener,然后我需要一种方法来提取它们的文本。我不能分配每一个,因为我说过,我不知道他们的号码和id,我几乎80%肯定没有分配。按钮是在一个recycleview中制作的,其中包含我从mysql数据库的表名中获取的文本。

  • 我想将结果发送到。我正在使用AJAX传递我的值。我不确定为什么我数据现在显示在一个按钮中。有谁能帮我解决这个问题吗?如果你们能给我提供如何解决我的问题的代码,那就更好了。提前道谢。 这是我的AJAX代码 编辑问题:我想根据用户当月的输入创建一个excel文件。因此,在用户选择了月份之后,当他们单击按钮时,excel文件将自动下载。我现在的问题是,我现在知道如何将month值传递到页面,在该页面中我