现在我正在使用OpenCV API(C++
)开发一些应用程序.此应用程序使用视频处理.
在电脑上一切都很快.今天我决定在Android上移植这个应用程序(将相机用作视频输入).幸运的是,有适用于Android的OpenCV,所以我只是将我的本机代码添加到Android应用程序示例中.一切都很好,除了性能.我对我的应用程序进行了基准测试,发现该应用程序的工作速度为4-5 fps,实际上是不可接受的(我的设备有单一的1ghz处理器) - 我希望它能以大约10 fps的速度工作.
是否可以完全重写我的应用程序C
?我知道使用这样的东西std::vector
对开发人员来说很舒服,但我不关心它.
似乎OpenCV's C
接口具有与接口相同的功能/方法C++
.
我用Google搜索了这个问题,但没有发现任何东西.
谢谢你的建议.
我对Android上的PixelFormat感到困惑.
我的设备是摩托罗拉Defy.
我有两个问题:
getWindowManager().getDefaultDisplay().getPixelFormat()
返回4代表RGB_565.据我所知,我的设备有16M颜色,这意味着每个像素3个(或4个alpha通道)字节:Run Code Online (Sandbox Code Playgroud)2^(8*3) = 2^24 = 16M
但RGB_565
格式每像素有2个字节(16位),代表65K颜色:
Run Code Online (Sandbox Code Playgroud)2^(8*2) = 2^16 = 65K
那么,为什么getPixelFormat()
不返回每像素3(或4个像RGBA)字节的格式?它是否显示驱动程序问题?我可以设置PixelFormat
为RGBA_8888(或模拟)吗?
getPixelFormat()
返回5.但是这个价值没有记载.它代表什么?实际上,在这种情况下效果与常数相同4
.但是从这次讨论中我发现5代表RGBA_8888
(但没有证据证明该陈述).那么如何才能找出设备屏幕的真实格式?另外我在Android 2.2上发现了一个中文设备,也有PixelFormat
5个,但真正的格式是4(就像我的摩托罗拉).我搜索了这些问题但没有发现任何问题.我发现唯一的东西是nexus 7也有5种格式.
更新:
我找到了方法,getWindow().setFormat()
但它实际上并没有改变主像素格式.
现在我正在尝试使用OpenCV创建数字识别系统.WEB中有很多文章和例子(甚至在StackOverflow上).我决定使用KNN分类器,因为这个解决方案在WEB中最受欢迎.我找到了一个手写数字数据库,训练集为60k,错误率低于5%.
我使用本教程作为如何使用OpenCV使用此数据库的示例.我使用完全相同的技术和测试数据(t10k-images.idx3-ubyte
)我有4%的错误率.但是当我尝试对自己的数字进行分类时,我会遇到更大的错误.例如:
等等(如果需要,我可以上传所有图像).
正如您所看到的,所有数字都具有良好的质量,并且易于识别.
所以我决定在分类之前做一些预处理.从上表MNIST数据库的网站,我发现人们使用歪斜校正,去除噪声,模糊和像素移位技术.不幸的是,几乎所有文章的链接都被打破了.所以我决定自己做这样的预处理,因为我已经知道如何做到这一点.
现在,我的算法如下:
我认为在我的情况下不需要去偏移,因为所有数字通常都是旋转的.而且我也不知道如何找到合适的旋转角度.所以在这之后我得到了这些图像:
所以,这样的预处理对我有所帮助,但我需要更好的结果,因为在我看来,这些数字应该被认可而没有问题.
任何人都可以通过预处理给我任何建议吗?谢谢你的帮助.
PS我可以上传我的源代码(c ++)代码.
我有OpenCV代码(c ++),我想在Android中使用它.要做到这一点,我必须使用Android NDK.我下载了用于Android开发的OpenCV软件包(版本 2.4.0),并完成了该手册的所有步骤.基本样本(仅限Java API)运行没有问题.示例#3 (教程3(高级) - 添加Native OpenCV)从ndk-builder正确构建.但是当我试图在eclipse上运行/调试它时总是出现异常:
Exception Ljava/lang/UnsatisfiedLinkError; thrown while initializing Lorg/opencv/samples/tutorial3/Sample3View;
Run Code Online (Sandbox Code Playgroud)
在这一行:
System.loadLibrary("native_sample");
Run Code Online (Sandbox Code Playgroud)
这是完整的logcat日志:
05-31 23:41:45.976: W/ActivityThread(9708): Application org.opencv.samples.tutorial3 is waiting for the debugger on port 8100...
05-31 23:41:45.983: I/System.out(9708): Sending WAIT chunk
05-31 23:41:45.983: I/dalvikvm(9708): Debugger is active
05-31 23:41:46.179: I/System.out(9708): Debugger has connected
05-31 23:41:46.179: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:46.382: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:46.585: I/System.out(9708): waiting for debugger to settle...
05-31 23:41:46.788: I/System.out(9708): …
Run Code Online (Sandbox Code Playgroud) 我想FREAK
在OpenCV 2.4.2中尝试新类.
我尝试使用特征检测器的通用接口来构造FREAK
,但是,当然,它不起作用.我应该如何修改我的代码以获得结果?
#include <stdio.h>
#include <iostream>
#include <opencv\cxcore.h>
#include <opencv2\nonfree\features2d.hpp>
#include <opencv\highgui.h>
#include <opencv2\features2d\features2d.hpp>
#include <vector>
using namespace std;
using namespace cv;
int main(){
Mat mat1;
mat1 = imread("Testimg06.jpg",0);
vector<KeyPoint> P1;
Ptr<FeatureDetector> freakdes;
Ptr<DescriptorExtractor> descriptorExtractor;
freakdes = FeatureDetector::create("FREAK");
freakdes->detect(mat1,P1);
Mat keypoint_img;
drawKeypoints( mat1, P1, keypoint_img, Scalar::all(-1), DrawMatchesFlags::DEFAULT );
imshow("Keypoints 1", keypoint_img );
cvWaitKey(0);
}
Run Code Online (Sandbox Code Playgroud) 据我所知,在Android 4.0(或更高版本)上,默认任务管理器显示程序的最后一个截图,程序图标没有左上角.见图:
我的问题是如何将任务管理器中的应用程序图像(不是图标)更改为自定义?不要问我为什么,我只是需要它.
经过一些研究后,我在SO上找到了类似的问题:在ICS的任务管理器中显示黑色预览屏幕.但它没有回答我的问题.
此外,我没有找到任何API与此任务管理器一起使用.
因此我决定在程序(活动)关闭时显示自定义图像.从活动生命周期中我发现我需要覆盖方法onPause
.所以我决定编写一个小程序.这很容易理解:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onResume()
{
super.onResume();
setContentView(createImageView("/sdcard/program-image.jpg"));
}
@Override
public void onPause()
{
setContentView(createImageView("/sdcard/task-manager-image.jpg"));
super.onPause();
}
private ImageView createImageView(String pathFile)
{
ImageView imageView = new ImageView(getApplication());
imageView.setImageBitmap(BitmapFactory.decodeFile(pathFile));
imageView.invalidate();
return imageView;
}
}
Run Code Online (Sandbox Code Playgroud)
在task-manager-image
真正显示了按Home键后一段时间,但任务管理器只显示program-image
.
这样做有什么好的解决方案吗?
谢谢你的帮助.
鉴于一个大城市(广场大约800平方公里),上面有一些层.该图层可能包含多色功能,例如:
功能数量约为1000.
地图资源 - 谷歌地图或Openstreetmap(或者其他什么?).
我的目标是在尺寸约为5x5米的纸张上打印此类地图.此文件也必须是高分辨率的 - 在本文中,我希望看到带有数字的建筑物,带有字幕的街道等等.
生成此类可打印文件(图像,文档等)的最佳方法是什么?
以下是我发现的一些可能的解决方案:
我知道OpenLayers API,所以我可以在Google Maps或Openstreetmap上绘制图层.但是如何将其转换为可打印格式?
我发现Openstreetmap上有导出功能.但是使用这个功能我不能导出我自己的图层,也不会是高分辨率.
Google地图具有类似的功能.使用它我可以创建自己的图层.但是如果我有1000个功能,那么URL会非常大,所以服务器不会加载它.此地图也不会很高.
谢谢你的帮助.
我正在寻找使用 OpenCV 将光栅图像转换为矢量数据的可能性。在那里我发现了一个cv::findContours()
似乎有点原始的函数(更可能是我没有完全理解它):
它似乎只使用黑白图像(没有灰度和彩色图像)并且似乎不接受任何可能对嘈杂图像有用的过滤/错误抑制参数,以避免非常短的矢量线或避免不均匀的折线单条直线会是更好的结果。
所以我的问题是:OpenCV 是否有可能对彩色光栅图像进行矢量化,然后将颜色信息分配给生成的 polylinbes?以及如何将降噪和错误抑制应用于这样的算法?
谢谢!
是否可以将PDF文件转换为cv::Mat
?我知道PDF文件通常是对象的矢量,但是给定了所需的分辨率.有没有可以进行这种转换的工具?
我有一个多色的图像.
我想计算图像的主色.主导颜色是红色,我想过滤掉红色.我在opencv中执行以下代码但它没有执行.
inRange(input_image, Scalar(0, 0, 0), Scalar(0, 0, 255), output);
Run Code Online (Sandbox Code Playgroud)
我怎么能得到主导色呢?我的最终项目应该自己确定对象的最大颜色.这方面最好的方法是什么?
opencv ×7
c++ ×4
android ×3
android-ndk ×1
c ×1
colors ×1
google-maps ×1
knn ×1
layer ×1
openlayers ×1
pdf ×1
performance ×1
pixelformat ×1
preview ×1
printing ×1
screenshot ×1
taskmanager ×1