几天前,我询问了一个UnsatisfiedLinkError来自非原生OpenCV代码的问题.我认为在重新安装Eclipse并关闭/重新打开所有软件包之后问题就解决了,但是在我将OpenCV代码放入现有onCreate()方法之后它又回来了.
我创建了一个名为Start的活动的新Android应用程序.然后我去了项目属性并将OpenCV添加为库.这是activity(Start.java)的代码:
package com.test;
import org.opencv.core.Mat;
import org.opencv.highgui.Highgui;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.view.Menu;
public class Start extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_start);
Mat Image = Highgui.imread("/image.jpg");
if (Image == null) {
AlertDialog ad = new AlertDialog.Builder(this).create();
ad.setMessage("Fatal error: can't open /image.jpg!");
}
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_start, menu);
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
这是日志:
08-13 12:26:14.791: E/Trace(1067): error opening trace file: No …Run Code Online (Sandbox Code Playgroud) 我的相机应用程序在屏幕上显示相机预览,并在后台处理它.以下是相关代码,尽可能压缩(例如,没有显示错误处理或字段声明):
public final class CameraView extends SurfaceView implements
SurfaceHolder.Callback, Runnable, PreviewCallback {
public CameraView(Context context, AttributeSet attrs) {
super(context, attrs);
mHolder = getHolder();
mHolder.addCallback(this);
mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
void openCamera() {
// Called from parent activity after setting content view to CameraView
mCamera = Camera.open();
mCamera.setPreviewCallbackWithBuffer(this);
}
public void surfaceCreated(SurfaceHolder holder) {
new Thread(this).start();
// Set CameraView to the optimal camera preview size
final Camera.Parameters params = mCamera.getParameters();
final List<Camera.Size> sizes = params.getSupportedPreviewSizes();
final int screenWidth = ((View) getParent()).getWidth();
int minDiff = Integer.MAX_VALUE; …Run Code Online (Sandbox Code Playgroud) 我正在编写一个Android应用程序来从图片中提取数独谜题.对于9x9 Sudoku网格中的每个单元格,我需要确定它是否包含数字1到9之一或是空白.我从像这样的Sudoku开始:

我使用OpenCV预处理数独,以提取各个数字的黑白图像,然后通过Tesseract将它们放入.但Tesseract有一些限制:
tesseract.setVariable("tessedit_char_whitelist", "123456789");
我有三个问题:
我试图在Android上实现这样的东西:http://www.youtube.com/watch?v = zjxWpKCQqJc.
这是我的代码:
public Mat onCameraFrame(CvCameraViewFrame inputFrame) {
Mat novo = new Mat();
Mat resp = new Mat();
Mat homer = new Mat();
//resp = inputFrame.gray();
novo = inputFrame.gray();
Mat lido = new Mat();
try {
lido = Utils.loadResource(this, R.drawable.homer);
} catch (IOException e) {
e.printStackTrace();
}
Imgproc.cvtColor(lido, homer, Imgproc.COLOR_RGB2GRAY);
FeatureDetector surf = FeatureDetector.create(FeatureDetector.FAST);
MatOfKeyPoint keypointsHomer = new MatOfKeyPoint();
MatOfKeyPoint keypoints = new MatOfKeyPoint();
surf.detect(homer, keypointsHomer);
surf.detect(novo, keypoints);
DescriptorExtractor SurfExtractor = DescriptorExtractor.create(FeatureDetector.SURF);
Mat descriptors = new …Run Code Online (Sandbox Code Playgroud) 使用OpenCV查找二进制图像中最大blob的边界框的最有效方法是什么?不幸的是,OpenCV没有特定的blob检测功能.我应该只使用findContours()并搜索列表中最大的?
给定图像上的一个点,我想要填充连接到该点的所有点 - 但是要填充到新图像上.一种天真的方法是将原始图像填充到特殊的魔术颜色值.然后,访问每个像素,并将具有此魔术颜色值的所有像素复制到新图像.肯定有更好的办法!
在我的Anaconda Python发行版上,复制一个16 GB或更大的Numpy数组(无论dtype如何)都会将副本的所有元素设置为0:
>>> np.arange(2 ** 31 - 1).copy() # works fine
array([ 0, 1, 2, ..., 2147483644, 2147483645,
2147483646])
>>> np.arange(2 ** 31).copy() # wait, what?!
array([0, 0, 0, ..., 0, 0, 0])
>>> np.arange(2 ** 32 - 1, dtype=np.float32).copy()
array([ 0.00000000e+00, 1.00000000e+00, 2.00000000e+00, ...,
4.29496730e+09, 4.29496730e+09, 4.29496730e+09], dtype=float32)
>>> np.arange(2 ** 32, dtype=np.float32).copy()
array([ 0., 0., 0., ..., 0., 0., 0.], dtype=float32)
Run Code Online (Sandbox Code Playgroud)
这是np.__config__.show()为了这个分布:
blas_opt_info:
library_dirs = ['/users/username/.anaconda3/lib']
define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
include_dirs = ['/users/username/.anaconda3/include'] …Run Code Online (Sandbox Code Playgroud) Android提供此代码,使相机预览面朝上显示所有相机和屏幕方向:
public static void setCameraDisplayOrientation(Activity activity,
int cameraId, android.hardware.Camera camera) {
android.hardware.Camera.CameraInfo info =
new android.hardware.Camera.CameraInfo();
android.hardware.Camera.getCameraInfo(cameraId, info);
int rotation = activity.getWindowManager().getDefaultDisplay()
.getRotation();
int degrees = 0;
switch (rotation) {
case Surface.ROTATION_0: degrees = 0; break;
case Surface.ROTATION_90: degrees = 90; break;
case Surface.ROTATION_180: degrees = 180; break;
case Surface.ROTATION_270: degrees = 270; break;
}
int result;
if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {
result = (info.orientation + degrees) % 360;
result = (360 - result) % 360; // compensate …Run Code Online (Sandbox Code Playgroud) 打开Android摄像头时,必须分别使用setPreviewDisplay()(API级别1)或setPreviewTexture()(API级别11)设置SurfaceHolder或OpenGL SurfaceTexture来保存显示的图像.速度,设备兼容性(除了API级别)或两者之间的图像质量有什么不同吗?
如何对此模糊图像进行阈值处理以使数字尽可能清晰?
在上一篇文章中,我尝试自适应地对模糊图像进行阈值处理(左图),这会导致数字失真和断开(右图):

从那时起,我已经使用如所描述的形态学闭运算试图此篇使图像均匀的亮度:

如果我自适应地对此图像进行阈值处理,则不会获得明显更好的结果.但是,由于亮度大致均匀,我现在可以使用普通阈值:

这比以前好多了,但我有两个问题:
我认为回到自适应阈值,但是具有非常大的块大小(图像的1/9)将解决这两个问题.相反,我最终得到一个奇怪的"光环效应",其中图像的中心更亮,但边缘与正常阈值图像大致相同:

编辑:remi 建议在形态上打开这篇文章右上角的阈值图像.这不太好用.使用椭圆内核,只有3x3足够小,以避免完全消除图像,即使这样,数字也会有明显的破损:

Edit2:mmgp 建议使用维纳滤镜来消除模糊.我将此代码用于OpenCV中的Wiener过滤到OpenCV4Android,但它使图像更加模糊!这是使用我的代码和5x5内核过滤之前(左)和之后的图像:

这是我改编的代码,它就地过滤:
private void wiener(Mat input, int nRows, int nCols) { // I tried nRows=5 and nCols=5
Mat localMean = new Mat(input.rows(), input.cols(), input.type());
Mat temp = new Mat(input.rows(), input.cols(), input.type());
Mat temp2 = new Mat(input.rows(), input.cols(), input.type());
// Create the kernel for convolution: a constant matrix with nRows rows
// and nCols cols, normalized so that the sum of the …Run Code Online (Sandbox Code Playgroud)