一,利用OpenCV的pyrDown() 实现图像缩小,上java代码
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btnProc;
private ImageView imageView;
private Bitmap bmp;
// Used to load the 'native-lib' library on application startup.
static {
System.loadLibrary("native-lib");
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// Example of a call to a native method
btnProc = (Button) findViewById(R.id.btn_gray_process);
imageView = (ImageView) findViewById(R.id.image_view);
bmp = BitmapFactory.decodeResource(getResources(), R.drawable.test3);
imageView.setImageBitmap(bmp);
btnProc.setOnClickListener(this);
}
/**
* A native method that is implemented by the 'native-lib' native library,
* which is packaged with this application.
*/
public static native int[] grayProc(int[] pixels, int w, int h);
@Override
public void onClick(View view) {
int w = bmp.getWidth();
int h = bmp.getHeight();
int[] pixels = new int[w*h];
bmp.getPixels(pixels, 0, w, 0, 0, w, h);
long startTime = System.currentTimeMillis();
int[] resultInt = grayProc(pixels, w, h);
long endTime = System.currentTimeMillis();
w = w/2;
h = h/2;
Log.e("JNITime",""+(endTime-startTime));
Bitmap resultImg = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
//(@ColorInt int[] pixels, int offset, int stride,int x, int y, int width, int height)
resultImg.setPixels(resultInt, 0, w, 0, 0, w, h);
imageView.setImageBitmap(resultImg);
}
}
二,实现jni方法
extern “C”
JNIEXPORT jintArray JNICALL
Java_com_example_dgxq008_opencv_1readpixel_MainActivity_grayProc(JNIEnv *env, jclass type
, jintArray pixels_
, jint w
, jint h) {
jint* pixels = env->GetIntArrayElements(pixels_, NULL);
if (pixels==NULL){
return 0;
}
//图片一进来时是ARGB 通过mat转换BGRA
Mat img(h,w,CV_8UC4,(uchar *)pixels); //pixels 操作的是同一份数据
// Mat out;
// cvtColor(img,out,COLOR_BGRA2RGB);
//
// //对应数据指针
// uchar* ptr = img.data;
//
// int length = w*h;
// int i;
// for (i = 0; i < length ; ++i) {
// ptr[4*i+0] = 0;
// ptr[4*i+1] = 0;
// ptr[4*i+2] = ptr[4*i+2];
// }
Mat temp;
//进行向上取样操作
//( InputArray src, OutputArray dst,const Size& dstsize = Size(), int borderType = BORDER_DEFAULT );
//缩小原图的一倍
pyrDown( img, temp, Size( img.cols/2, img.rows/2 ) );
//对应数据指针
uchar* ptrTemp = temp.data;
int size = w*h/4;
jintArray result = env->NewIntArray(size);
env->SetIntArrayRegion(result,0,size,(jint*)ptrTemp);
env->ReleaseIntArrayElements(pixels_, pixels, 0);
return result;
}