将Mat对象从androidjava传递到本机cpp部分
Passing Mat object from android java to native cpp part
我将Mat对象从android java代码传递到本机cpp部分,但得到了"OpenCV错误:不支持的格式或格式组合"。请帮忙。提前谢谢。
Java代码:
public class MainActivity extends ActionBarActivity {
static {
if (!OpenCVLoader.initDebug())
Log.d("ERROR", "Unable to load OpenCV");
else
Log.d("SUCCESS", "OpenCV loaded");
}
private static final String TAG = "OpenCV";
TextView tv;
ImageView img;
Button bt;
Bitmap bm;
int x = 0;
String s = "";
private Mat m;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public native String nativeCode(long mat);
private BaseLoaderCallback mOpenCVCallBack = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS: {
Log.i(TAG, "OpenCV loaded successfully");
setContentView(R.layout.activity_main);
tv = (TextView) findViewById(R.id.tv);
img = (ImageView) findViewById(R.id.iv);
bt = (Button) findViewById(R.id.button1);
img.setImageResource(R.drawable.c);
bm = (Bitmap) ((BitmapDrawable) img.getDrawable()).getBitmap();
bt.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Utils.bitmapToMat(bm, m);
nativeCode(m.getNativeObjAddr());
}
});
}
break;
default: {
super.onManagerConnected(status);
}
break;
}
}
};
@Override
public void onResume() {
super.onResume();
LoaderCallbackInterface mLoaderCallback = null;
try {
mOpenCVCallBack.onManagerConnected(LoaderCallbackInterface.SUCCESS);
m = new Mat(bm.getHeight(), bm.getWidth(), CvType.CV_8U, new Scalar(1));
Log.i(TAG, "opencv successfull and object created");
} catch (Exception e) {
Log.e(TAG, "Cannot connect to OpenCV Manager");
}
}
static {
System.loadLibrary("hellocpp");
System.loadLibrary("opencv_java");
}
@Override
public void onStop() {
super.onStop();
if (m != null) m.release();
m = null;
}
}
nativeCode:
class WatershedSegmenter{
private:
Mat markers;
public:
void setMarkers(Mat& markerImage){
markerImage.convertTo(markers, CV_32S);
}
Mat process(Mat &image){
watershed(image, markers);
markers.convertTo(markers,CV_8U);
return markers;
}
};
JNIEXPORT jstring JNICALL
Java_com_example_color_MainActivity_stringFromJNI(JNIEnv *env, jobject thiz, jlong mat)
{
Mat& input = *(Mat*)mat;
Mat inputImage = input.clone();
Mat blank(inputImage.size(),CV_8U,Scalar(0xFF));
Mat dest;
Mat markers(inputImage.size(),CV_8U,Scalar(-1));
markers(Rect(0,0,inputImage.cols, 5)) = Scalar::all(1);
markers(Rect(0,inputImage.rows-5,inputImage.cols, 5)) = Scalar::all(1);
markers(Rect(0,0,5,inputImage.rows)) = Scalar::all(1);
markers(Rect(inputImage.cols-5,0,5,inputImage.rows)) = Scalar::all(1);
int centreW = inputImage.cols/4;
int centreH = inputImage.rows/4;
markers(Rect((inputImage.cols/2)-(centreW/2),(inputImage.rows/2)-(centreH/2), centreW, centreH)) = Scalar::all(2);
markers.convertTo(markers,CV_BGR2GRAY);
WatershedSegmenter segmenter;
segmenter.setMarkers(markers);
Mat wshedMask = segmenter.process(inputImage);
string result = "success";
return env->NewStringUTF((const char* )result.c_str());
}
错误:
OpenCV Error: Unsupported format or combination of formats (Only 8-bit, 3-channel input images are supported) in void cvWatershed(const CvArr*, CvArr*), file /hdd2/buildbot/slaves/slave_ardbeg1/50-SDK/opencv/modules/imgproc/src/segmentation.cpp, line 147
您可以尝试更改此
m = new Mat(bm.getHeight(), bm.getWidth(), CvType.CV_8U, new Scalar(1));
至
m = new Mat(bm.getHeight(), bm.getWidth(), CvType.CV_8U, new Scalar(3));
相关文章:
- 从C++本机插件更新Vector3数组
- GCC本机矩阵运算库
- VC++本机单元测试,找不到调试符号
- 在这种情况下,java对象是否可以调用本机函数
- PC中的程序和PHONE中的本机描述应用程序之间的数据连接
- 为什么导入Mixed native/CLR lib.dll的本机C++应用程序没有在Mixed lib.dll中的外部变
- 无法将标准库导入本机 android 项目中的头文件
- 使用本机 C++ 应用程序中的 C# 代码
- 在nodejs中使用本机代码的最佳方法是什么?
- 如何告诉本机节点模块所需的dll存储在哪里?
- 在自定义程序中使用本机 Windows 自然顺序排序
- 如何在C++非托管/本机 DLL 中从注册免费 COM C# 托管 DLL 创建 COM 对象
- MS 本机单元测试 - 断言::线程失败不起作用
- 将音频从浏览器流式传输到WebRTC本机C++应用程序
- 如何将 WebAssembly 编译成常规汇编/本机代码(或 Cpp 等)
- 本机 cpp 中存在许多未解决的错误
- 使用Binder从本机cpp应用程序绑定Intent内部
- 将Mat对象从androidjava传递到本机cpp部分
- 如何将文件.cpp编译为本机编译
- 如果我将文件扩展更改为.cpp,本机活动示例项目将无法编译