Java 如何在android中用坐标捕捉图像
我是android新手,我想把我的问题摆在你们面前 我想在四个坐标之间拍摄一幅图像,如下所示 首先,我将图像转换为位图,然后将其设置为相对布局的背景。我知道这四个坐标 那我怎么才能把图像放在盒子里,然后把它设置成另一个布局作为背景呢Java 如何在android中用坐标捕捉图像,java,android,image-processing,bitmap,image-manipulation,Java,Android,Image Processing,Bitmap,Image Manipulation,我是android新手,我想把我的问题摆在你们面前 我想在四个坐标之间拍摄一幅图像,如下所示 首先,我将图像转换为位图,然后将其设置为相对布局的背景。我知道这四个坐标 那我怎么才能把图像放在盒子里,然后把它设置成另一个布局作为背景呢 伙计们,请让我从这个逻辑中说出来……至于在坐标范围内获得图像 Bitmap croppedBmp = Bitmap.createBitmap(originalBmp, startx, starty, endx, endy); 这将创建一个裁剪后的位图,就像您的a
伙计们,请让我从这个逻辑中说出来……至于在坐标范围内获得图像
Bitmap croppedBmp = Bitmap.createBitmap(originalBmp, startx, starty, endx, endy);
这将创建一个裁剪后的位图,就像您的after这将(很可能)从4、5、6等点创建一个图像,您可以手动单击ImageView
以获取该图像。这应该适用于选择的4个以上的点
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ImageView imageView = (ImageView) findViewById(R.id.img);
compositeImageView = (ImageView) findViewById(R.id.imageView);
Bitmap bitmap1=BitmapFactory.decodeResource(getResources(), R.drawable.drawable_android);
Bitmap bitmap2=BitmapFactory.decodeResource(getResources(), R.drawable.drawable_android_cr);
Bitmap resultingImage=Bitmap.createBitmap(320, 480, bitmap1.getConfig());
Canvas canvas = new Canvas(resultingImage);
Paint paint = new Paint();
paint.setAntiAlias(true);
Path path=new Path();
imageView.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
if (event.getAction() == MotionEvent.ACTION_DOWN){
// textView.setText("Touch coordinates : " +String.valueOf(event.getX()) + "x" + String.valueOf(event.getY()));
Log.e("X",String.valueOf(event.getX())+"");
Log.e("y",String.valueOf(event.getY())+"");
path.lineTo(String.valueOf(event.getX()), String.valueOf(event.getY()));
}
if(/*Touch count == 4 or 5 or 6 etc.*/){
canvas.drawPath(path, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap2, 0, 0, paint);
compositeImageView.setImageBitmap(resultingImage);
return true;
}
}
});
}
最后,我找到了解决问题的方法,我想与大家分享 首先,这是基于+12级别的转换理论进行的。 好的,我的问题在“Android版OpenCv”的帮助下解决了 这是密码
public class MainActivity extends Activity implements CvCameraViewListener2,OnTouchListener
{
Bitmap sourceBitmap,descBitmap,sourceBitmap1;
ImageView view,view2;
SurfaceView amSurfaceView ;
Mat mRgba;
private CameraBridgeViewBase mOpenCvCameraView;
private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
@Override
public void onManagerConnected(int status) {
switch (status) {
case LoaderCallbackInterface.SUCCESS:
{
Log.i("Yesssssssss", "OpenCV loaded successfully");
mOpenCvCameraView.enableView();
} break;
default:
{
super.onManagerConnected(status);
} break;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// initialise bitmap for crop is here
Bitmap bitmap_source=BitmapFactory.decodeResource(getResources(), R.drawable.quadone);
if(bitmap_source==null)
Log.e("bitmap Null","nulllllll");
// these values should not exceed the limits of bitmap..
Log.e("Bitmap"," "+bitmap_source.getWidth()+" "+bitmap_source.getHeight());
sourceBitmap =BitmapFactory.decodeResource(getResources(), R.drawable.quadone);
sourceBitmap1 =BitmapFactory.decodeResource(getResources(), R.drawable.quadone);
descBitmap =BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
view = (ImageView) findViewById(R.id.imageView1);
view2=(ImageView) findViewById(R.id.imageView2);
view.setImageBitmap(sourceBitmap1);
view.setOnTouchListener(this);
mOpenCvCameraView = (CameraBridgeViewBase) findViewById(R.id.color_blob_detection_activity_surface_view);
mOpenCvCameraView.setCvCameraViewListener(this);
Log.e("MAtt","Startttttttttmmmmmmmmmtttttttt");
sourceBitmap =bitmap_source;
if (!OpenCVLoader.initDebug()) {
// Handle initialization error
}
Mat inputMat = new Mat();
Mat outputMat = new Mat();
descBitmap=sourceBitmap;
Utils.bitmapToMat(sourceBitmap, inputMat);
List<Point> src_pnt = new ArrayList<Point>();
Point p0 = new Point(0, 0);
src_pnt.add(p0);
Point p1 = new Point(10, 100);
src_pnt.add(p1);
Point p2 = new Point(100, 125);
src_pnt.add(p2);
Point p3 = new Point(90, 20);
src_pnt.add(p3);
Mat startM = Converters.vector_Point2f_to_Mat(src_pnt);
List<Point> dst_pnt = new ArrayList<Point>();
Point p4 = new Point(0.0, 0.0);
dst_pnt.add(p4);
Point p5 = new Point(0.0, sourceBitmap.getHeight());
dst_pnt.add(p5);
Point p6 = new Point(sourceBitmap.getWidth(), sourceBitmap.getHeight());
dst_pnt.add(p6);
Point p7 = new Point(sourceBitmap.getWidth(), 0);
dst_pnt.add(p7);
Mat endM = Converters.vector_Point2f_to_Mat(dst_pnt);
Mat perspectiveTransform = Imgproc.getPerspectiveTransform(startM, endM);
Size size = new Size(sourceBitmap.getWidth(), sourceBitmap.getHeight());
Scalar scalar = new Scalar(50.0);
Imgproc.warpPerspective(inputMat, outputMat, perspectiveTransform, size, Imgproc.INTER_LINEAR + Imgproc.CV_WARP_FILL_OUTLIERS, Imgproc.BORDER_DEFAULT, scalar);
Log.e("1=",""+inputMat.cols()+" "+inputMat.rows());
Log.e("outmat.."," "+outputMat.cols()+" "+outputMat.rows());
Utils.matToBitmap(outputMat, descBitmap);
view2.setImageBitmap(descBitmap);
// ram@san
}
@Override
public void onCameraViewStarted(int width, int height) {
// TODO Auto-generated method stub
Log.e("onCameraViewStarted","onCameraViewStarted");
}
@Override
public void onCameraViewStopped() {
// TODO Auto-generated method stub
Log.e("onCameraViewStopped","onCameraViewStopped");
}
@Override
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
// TODO Auto-generated method stub
mRgba= new Mat();
Utils.bitmapToMat(sourceBitmap, mRgba);
Utils.matToBitmap(mRgba, descBitmap);
view2.setImageBitmap(sourceBitmap);
return mRgba;
}
@Override
public boolean onTouch(View v, MotionEvent event) {
// TODO Auto-generated method stub
return false;
}
}
public类MainActivity扩展活动实现CvCameraViewListener2,OnTouchListener
{
位图sourceBitmap、descBitmap、sourceBitmap1;
图像视图,视图2;
SurfaceView amSurfaceView;
Mat-mRgba;
私人摄像机BridgeViewBase mOpenCvCameraView;
专用BaseLoaderCallback mlLoaderCallback=新BaseLoaderCallback(此){
@凌驾
已连接管理器上的公共无效(int状态){
开关(状态){
案例加载程序CallbackInterface.SUCCESS:
{
Log.i(“是”,“OpenCV加载成功”);
mOpenCvCameraView.enableView();
}中断;
违约:
{
超级管理器已连接(状态);
}中断;
}
}
};
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//此处是作物的初始化位图
位图Bitmap_source=BitmapFactory.decodeResource(getResources(),R.drawable.quadone);
if(位图_源==null)
Log.e(“位图空”、“空”);
//这些值不应超过位图的限制。。
Log.e(“位图”,“位图+源代码.getWidth()+”+位图+源代码.getHeight());
sourceBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.quadone);
sourceBitmap1=BitmapFactory.decodeResource(getResources(),R.drawable.quadone);
descBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_启动器);
视图=(ImageView)findViewById(R.id.imageView1);
view2=(ImageView)findViewById(R.id.imageView2);
view.setImageBitmap(sourceBitmap1);
view.setOnTouchListener(这个);
mOpenCvCameraView=(CameraBridgeViewBase)findViewById(R.id.color\u blob\u detection\u activity\u surface\u view);
mOpenCvCameraView.setCvCameraViewListener(本);
Log.e(“MAtt”,“startttttttmmmmmtttttt”);
sourceBitmap=bitmap\u源;
如果(!OpenCVLoader.initDebug()){
//处理初始化错误
}
Mat inputMat=新Mat();
Mat outputMat=新Mat();
descBitmap=源位图;
bitmapToMat(源位图,inputMat);
List src_pnt=new ArrayList();
p0点=新点(0,0);
src_pnt.add(p0);
点p1=新点(10100);
src_pnt.add(p1);
点p2=新点(100125);
src_pnt.add(p2);
点p3=新点(90,20);
src_pnt.add(p3);
Mat startM=转换器。向量点2f到Mat(src\u pnt);
List dst_pnt=new ArrayList();
点p4=新点(0.0,0.0);
dst_pnt.add(第4页);
点p5=新点(0.0,sourceBitmap.getHeight());
dst_pnt.add(p5);
点p6=新点(sourceBitmap.getWidth(),sourceBitmap.getHeight());
dst_pnt.add(第6页);
点p7=新点(sourceBitmap.getWidth(),0);
dst_pnt.add(第7页);
Mat endM=转换器。矢量点2f到Mat(dst pnt);
Mat perspectiveTransform=Imgproc.getPerspectiveTransform(startM,endM);
Size Size=新大小(sourceBitmap.getWidth(),sourceBitmap.getHeight());
标量=新标量(50.0);
Imgproc.warpPerspective(输入Mat、输出Mat、透视变换、大小、Imgproc.INTER_LINEAR+Imgproc.CV_WARP_FILL_OUTLIERS、Imgproc.BORDER_DEFAULT、标量);
Log.e(“1=”,“”+inputMat.cols()+“”+inputMat.rows());
Log.e(“outmat..”、“”+outputMat.cols()+“”+outputMat.rows());
Utils.matToBitmap(outputMat,descBitmap);
view2.setImageBitmap(描述位图);
// ram@san
}
@凌驾
开始时的公共空隙(整数宽度、整数高度){
//TODO自动生成的方法存根
Log.e(“onCameraViewStarted”、“onCameraViewStarted”);
}
@凌驾
CAMERAVIEWSTOPPED()上的公共空白{
//TODO自动生成的方法存根
Log.e(“onCameraViewStopped”、“onCameraViewStopped”);
}
@凌驾
CameraFrame上的公用Mat(CvCameraViewFrame输入框){
//TODO自动生成的方法存根
mRgba=新材料();
bitmapToMat(源位图,mRgba);
Utils.matToBitmap(mRgba,描述位图);
view2.setImageBitmap(源位图);
返回mRgba;
}
@凌驾
公共布尔onTouch(视图v,运动事件){
//TODO自动生成的方法存根
返回false;
}
}
如果有人有疑问,请把它放在这里
祝您编码愉快,拉姆..谢谢您的重播,但这是一个矩形位图。。但我需要四个坐标的帮助…@Roy jamesThis将创建一个矩形裁剪图像-不是吗?是的,对不起,哈哈,只是扫了一眼图像,以为它是一个你想要的矩形