gpt4 book ai didi

android - Android 中的 OpenCv : keypoint detection in images from file

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:35:48 25 4
gpt4 key购买 nike

我是 OpenCv 和 StackOverflow 的新手,对 Android 编程几乎是新手,所以如果我的问题很愚蠢,请原谅。

我正在尝试将从相机获取的图像与某些图像文件进行匹配,以查看哪个图像文件与相机图像更相似。所以我使用 DescriptorExtractor.compute 来获取文件图像的关键点和带有 SURF 的相机图像(我也尝试过 SIFT)以匹配它们但是......应用于文件图像的方法总是返回一个空的关键点列表,而如果我在相机图像上使用它,我总是得到一个非空列表(平均一百个点)。最让我困惑的是,即使使用完全相同的图像,首先从相机加载,然后从文件加载,我也会出现这种行为。

你能帮我弄清楚我做错了什么吗?这是一些测试代码(仅针对文件部分,但我也使用相同的方法 getKp 从相机中提取关键点)。

public class HelloOpenCvActivity extends Activity {
private static final int FILE_REQUEST = 400;
/** Called when the activity is first created. */

ImageView img;
TextView txt;
Bitmap logo;

@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

img = (ImageView) findViewById(R.id.image);
txt = (TextView) findViewById(R.id.kp);

img.setOnClickListener(new OnClickListener() {

public void onClick(View v) {
chooseFile();
}
});
}

private void chooseFile(){
Intent fileIntent = new Intent(Intent.ACTION_GET_CONTENT);
fileIntent.addCategory(Intent.CATEGORY_OPENABLE);
fileIntent.setType("image/*");
startActivityForResult(Intent.createChooser(fileIntent,"prova"), FILE_REQUEST);
}

/*Quando ho il risultato della chiamata al file explorer, viene invocata questa callback */
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == FILE_REQUEST) {
// obtain the filename
Uri uri = data.getData();
String filePath = null;
if (uri != null) {
if (uri.toString().startsWith("file:")) {
filePath = uri.getPath();
} else { // uri.startsWith("content:")
Cursor c = getContentResolver().query(uri, null, null, null, null);
if (c != null && c.moveToFirst()) {
int id = c.getColumnIndex(Images.Media.DATA);
if (id != -1) {
filePath = c.getString(id);
}
}
}
}
if (filePath != null) {
logo = BitmapFactory.decodeFile(filePath);
img.setImageBitmap(logo);
txt.setText(""+getKp(logo).size());
}
}
}

private List<KeyPoint> getKp(Bitmap bm){
Mat image = Utils.bitmapToMat(bm);

List<KeyPoint> kp = new ArrayList<KeyPoint>();
FeatureDetector fd = FeatureDetector.create(FeatureDetector.SURF);
fd.detect(image, kp);


return kp;
}

}

非常感谢。

麦酒

最佳答案

经过数小时的研究和头痛 ;-) 我发现了问题所在。来自相机和文件的图像都可以存储在位图对象中,但它们的配置 (Bitmap.Config) 不同:相机图像为 ARGB_8888,文件图像为 RGB_565。通过Bitmap.copy 方法将文件图像中的位图配置更改为ARGB_8888 是解决方案。

private List<KeyPoint> getKp(Bitmap bm){
//scale bitmap (otherwise the program crashes due to memory lack)
int MAX_DIM = 300;
int w, h;
if (bm.getWidth() >= bm.getHeight()){
w = MAX_DIM;
h = bm.getHeight()*MAX_DIM/bm.getWidth();
}
else{
h = MAX_DIM;
w = bm.getWidth()*MAX_DIM/bm.getHeight();
}
bm = Bitmap.createScaledBitmap(bm, w, h, false);

//change bitmap config <- THAT'S THE POINT!
Bitmap img = bm.copy(Bitmap.Config.ARGB_8888, false);

Mat image = Utils.bitmapToMat(img);

List<KeyPoint> kp = new ArrayList<KeyPoint>();
FeatureDetector fd = FeatureDetector.create(FeatureDetector.SURF);
fd.detect(image, kp);

return kp;
}

希望这可以帮助遇到同样问题的任何人。 :-)

关于android - Android 中的 OpenCv : keypoint detection in images from file,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8079746/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com