我做了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>
你不需要做两次。你可以打一个电话。
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();
}
})
正如我在评论中所说,您在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文件:
我需要一种方法来为未知数量的按钮创建OnClickListener,然后我需要一种方法来提取它们的文本。我不能分配每一个,因为我说过,我不知道他们的号码和id,我几乎80%肯定没有分配。按钮是在一个recycleview中制作的,其中包含我从mysql数据库的表名中获取的文本。
问题内容: 将Docker for Mac 1.13.1与以下Dockerfile一起使用: 使用以下内容的contab文件: 当我使用以下命令构建和运行它时: 我看到输出: 如果我等待一分钟,则不会出现输出。但是,如果我登录到正在运行的容器并拖尾文件,则可以看到内容: 我尝试在CMD的末尾添加另一个回显,以查看是否只是吞没了STDOUT的最后一个命令,但这没有帮助。 我已经将代码发布在githu
我想将结果发送到。我正在使用AJAX传递我的值。我不确定为什么我数据现在显示在一个按钮中。有谁能帮我解决这个问题吗?如果你们能给我提供如何解决我的问题的代码,那就更好了。提前道谢。 这是我的AJAX代码 编辑问题:我想根据用户当月的输入创建一个excel文件。因此,在用户选择了月份之后,当他们单击按钮时,excel文件将自动下载。我现在的问题是,我现在知道如何将month值传递到页面,在该页面中我