我在Android上使用opencv库时遇到问题。我尝试将imageview转换为位图,然后将位图转换为mat(用于opencv进程),然后再次将其转换为位图。但是我在运行程序时得到了强制选择。这是我的代码:
public class MainActivity extends Activity {
protected static final String TAG = null;
ImageView img;
Button btn;
private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i(TAG, "OpenCV loaded successfully");
// Create and set View
setContentView(R.layout.activity_main);
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
@Override
public void onResume() {
super.onResume();
LoaderCallbackInterface mLoaderCallback = null;
OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_2_4_6, this, mLoaderCallback);
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//convert imageview to bitmap
img =(ImageView) findViewById(R.id.imageView1);
BitmapDrawable drawable = (BitmapDrawable) img.getDrawable();
final Bitmap imgbitmap = drawable.getBitmap();
btn=(Button) findViewById(R.id.button1);
btn.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
//convert Bitmap to Mat
Mat ImageMat = new Mat ( imgbitmap.getHeight(), imgbitmap.getWidth(), CvType.CV_8U, new Scalar(4));
Bitmap myBitmap32 = imgbitmap.copy(Bitmap.Config.ARGB_8888, true);
Utils.bitmapToMat(myBitmap32, ImageMat);
//convert to grayscale
Imgproc.cvtColor(ImageMat, ImageMat, Imgproc.COLOR_RGB2GRAY,4);
//Then convert the processed Mat to Bitmap
Bitmap resultBitmap = Bitmap.createBitmap(ImageMat.cols(), ImageMat.rows(),Bitmap.Config.ARGB_8888);;
Utils.matToBitmap(ImageMat, resultBitmap);
//convert bitmap to imageview
ImageView imgbit;
imgbit = (ImageView) findViewById(R.id.imageView2);
imgbit.setImageBitmap(resultBitmap);
}
});
}
}
这是我的日志:
12-09 16:27:23.052: D/dalvikvm(7837): Debugger has detached; object registry had 1 entries
12-09 16:27:23.582: D/dalvikvm(7837): GC_EXTERNAL_ALLOC freed 50K, 45% free 3007K/5379K, external 733K/1041K, paused 359ms
12-09 16:27:23.762: D/InputQueue(7837): Registering input channel '2b3941f0 com.gozur.latihanpcd/com.gozur.latihanpcd.MainActivity (client)'
12-09 16:27:23.812: I/FihConfig(7837): can not find this tag <SYSTEM_CUST_HANDWRITING>in the mUsedConfigData Array
12-09 16:27:38.492: D/dalvikvm(7990): GC_EXTERNAL_ALLOC freed 47K, 45% free 3007K/5379K, external 733K/1041K, paused 85ms
12-09 16:27:38.582: D/InputQueue(7990): Registering input channel '2b014008 com.gozur.latihanpcd/com.gozur.latihanpcd.MainActivity (client)'
12-09 16:27:38.642: I/FihConfig(7990): can not find this tag <SYSTEM_CUST_HANDWRITING>in the mUsedConfigData Array
12-09 16:27:40.362: D/WindowManager(7990): MotionEvent obtain 1 : MotionEvent{2afc4910 action=0 x=58.0 y=13.0 pressure=1.0 size=0.0}
12-09 16:27:40.492: W/dalvikvm(7990): No implementation found for native Lorg/opencv/core/Mat;.n_Mat (IIIDDDD)J
12-09 16:27:40.492: D/AndroidRuntime(7990): Shutting down VM
12-09 16:27:40.492: W/dalvikvm(7990): threadid=1: thread exiting with uncaught exception (group=0x2aacc560)
12-09 16:27:40.502: E/AndroidRuntime(7990): Uncaught handler: thread main exiting due to uncaught exception
12-09 16:27:40.532: W/System.err(7990): java.io.FileNotFoundException: /data/logcat_0.txt (Permission denied)
12-09 16:27:40.532: E/AndroidRuntime(7990): FATAL EXCEPTION: main
12-09 16:27:40.532: E/AndroidRuntime(7990): java.lang.UnsatisfiedLinkError: n_Mat
12-09 16:27:40.532: E/AndroidRuntime(7990): at org.opencv.core.Mat.n_Mat(Native Method)
12-09 16:27:40.532: E/AndroidRuntime(7990): at org.opencv.core.Mat.<init>(Mat.java:535)
12-09 16:27:40.532: E/AndroidRuntime(7990): at com.gozur.latihanpcd.MainActivity$1.onClick(MainActivity.java:66)
12-09 16:27:40.532: E/AndroidRuntime(7990): at android.view.View.performClick(View.java:2494)
12-09 16:27:40.532: E/AndroidRuntime(7990): at android.view.View$PerformClick.run(View.java:9109)
12-09 16:27:40.532: E/AndroidRuntime(7990): at android.os.Handler.handleCallback(Handler.java:587)
12-09 16:27:40.532: E/AndroidRuntime(7990): at android.os.Handler.dispatchMessage(Handler.java:92)
12-09 16:27:40.532: E/AndroidRuntime(7990): at android.os.Looper.loop(Looper.java:130)
12-09 16:27:40.532: E/AndroidRuntime(7990): at android.app.ActivityThread.main(ActivityThread.java:3683)
12-09 16:27:40.532: E/AndroidRuntime(7990): at java.lang.reflect.Method.invokeNative(Native Method)
12-09 16:27:40.532: E/AndroidRuntime(7990): at java.lang.reflect.Method.invoke(Method.java:507)
12-09 16:27:40.532: E/AndroidRuntime(7990): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:895)
12-09 16:27:40.532: E/AndroidRuntime(7990): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:653)
12-09 16:27:40.532: E/AndroidRuntime(7990): at dalvik.system.NativeStart.main(Native Method)
12-09 16:27:40.572: W/System.err(7990): java.io.FileNotFoundException: /data/plog.log (Permission denied)
最佳答案
我非常怀疑您的代码能否在将图像转换为灰度之前显示图像的原始版本,因为您的日志猫错误说
No implementation found for native Lorg/opencv/core/Mat
这意味着您在调用opencv API之前尚未完成静态初始化
static {
if (!OpenCVLoader.initDebug())
{
// Handle initialization error
} }
请按照here的步骤3和4进行操作。
关于android - Android:初学者使用Opencv库(转换为opencv格式),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20466001/