- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试有效地将 BufferedImage 转换为 IplImage...您能给我一些关于 jni 部分的提示吗?
现在我执行以下步骤:
我从 BufferedImage 获取 rgbs 并将它们发送到我执行以下操作的 jni 代码:
IplImage* getIplImageFromIntArray(JNIEnv* env, jintArray array_data,
jint width, jint height) {
int *pixels = env->GetIntArrayElements(array_data, 0);
if (pixels == 0) {
return 0;
}
IplImage *image = loadPixels(pixels, width, height);
env->ReleaseIntArrayElements(array_data, pixels, 0);
if (image == 0) {
return 0;
}
return image;}};
和
IplImage* loadPixels(int* pixels, int width, int height) {
int x, y;
IplImage *img = cvCreateImage(cvSize(width, height), IPL_DEPTH_8U, 3);
unsigned char* base = (unsigned char*) (img->imageData);
unsigned char* ptr;
for (y = 0; y < height; y++) {
ptr = base + y * img->widthStep;
for (x = 0; x < width; x++) {
// blue
ptr[3 * x] = pixels[x + y * width] & 0xFF;
// green
ptr[3 * x + 1] = pixels[x + y * width] >> 8 & 0xFF;
// blue
ptr[3 * x + 2] = pixels[x + y * width] >> 16 & 0xFF;
}
}
return img;}
但这真的很慢......谢谢你的帮助!
最佳答案
与 JavaCV :
IplImage.createFrom(aBufferedImage)
编辑:您的代码运行缓慢有几个原因。 BufferedImage 类是在 NIO 缓冲区流行之前设计的,因此它使用标准 Java 数组作为后备缓冲区。不能(安全地)直接从 JNI 访问 Java 数组,因此默认情况下,通过调用 GetIntArrayElements() 的方式,临时分配内存并将数组数据复制到新分配的内存中,而 ReleaseIntArrayElements() 也会复制回数据进入数组,并释放临时分配的内存。并且您还在每次调用时分配一个新的 IplImage,并在将所有内容从该临时缓冲区复制到临时 IplImage 时制作另一个拷贝。简而言之,您的代码在堆上分配了两次内存并复制了三次数据。实现预期效果的推荐方法是使用直接 NIO 缓冲区从 Java 内部仅复制一次数据。您可以通过查看 JavaCV 源代码的相关部分(即 IplImage.copyFrom(BufferedImage))来检查它的外观:
它分支成许多特殊情况,但基本上它遍历所有像素以生成拷贝。添加几个线程以在多个内核上并行循环也可以进一步提高性能...
从 Java 复制数据后,如果需要,您可以直接从 native 代码使用它。
关于java - 高效地将 BufferedImage 转换为 IplImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8904285/
是否可以使用 OpenCv (JavaCv) 将图像放入图像中。例如,我有一张 1000x1000 的图像和一张 100x100 的图像。在 600x600 的位置,我想将较小的图像放在较大的图像中。
我必须在内存中保存预定义数量的图像。我创建了一个像这样的数组: int nb_frame_decalage=10; IplImage** accumulateur_image; CvCapture*
我想使用下面的代码保存一个 IplImage(不是 IplImage*) IplImage ipl_from_mat((IplImage)imgDisparity8U); cvNamedWindow(
我需要将 8 位 IplImage 转换为 32 位 IplImage。使用来自整个网络的文档,我尝试了以下操作: // general code img2 = cvCreateImage(cvSiz
当我尝试使用 cvCopy 将一个由 3 个 channel 组成的 IplImage 复制到一个具有 4 个 channel 的 IplImage(我稍后需要额外的 channel )时,我得到的只
我有一个 8 位的 IplImage,我想将它转换为 24 位的 IplImage。我该怎么做? 最佳答案 假设您的灰度图像位于名为 image 的变量中 - IplImage *rgbimage =
我想知道在 opencv 中裁剪 IplImage 的最有效方法是什么。我目前正在执行以下操作,但它似乎太复杂了,我确信有更好的方法。 // set ROI on original image
该代码用于8位数据,以生成灰度IplImage。 IplImage* img_gray_resize = NULL; img_gray_resize = cvCreateImage(c
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我有一个变量 char* ImgMem,它包含所需图像的图像内存(三个 channel /RAW 16),我想将它分成三个并将每个在单 channel 的 IplImage 中:一个用于 R,一个用于
是否有一种简单且成本低廉的方法可以沿 y 轴翻转 IplImage?我正在使用高帧率。 最佳答案 cvFlip(参见 Operation On Arrays )可以原地翻转。支持水平、垂直和组合翻转。
如何使用 OpenCV 获得最清晰的 iplimage?当没有训练图像进行比较时。 例如,有一个移动手的网络摄像头输入。但是当我播放这个视频时,我得到了 10 个 iplimages。但只有第五个更清
我像这样在 IplImage 上绘制对象: cvLine(image, point_1, point_2, color, thickness, CV_AA); // Line cvCircle(mag
我正在尝试从通过 USB 连接到 Raspberry Pi 的罗技高清摄像头捕获帧,RP 正在运行 arch linux,我正在使用 OpenCV C api 和 TCP 客户端。 TCP服务器在ub
当我们有一个 IplImage ,我们如何保存它以便以后使用,或者在我们的代码之外将其作为图像查看(例如通过 png 或 jpeg)? 作为代码示例,我有以下内容: void SaveImage()
OpenCV 中的IplImage 是什么?你能解释一下它作为一种类型的含义吗?我们应该什么时候使用它? 谢谢。 最佳答案 根据您在问题中的“c++”标签:你不应该使用它,你应该使用 cv::Mat。
不知道为什么会这样。方法 : IplImage.createFrom(image); 正在挂起而没有返回任何值。我尝试了多个图像,并确认了它们的存在。我正在编写一个利用模板匹配的应用程序,但是这个第一
我正在尝试对图像应用概率霍夫变换,但出现此编译器错误: invalid initialization of reference of type ‘cv::InputArray {aka const c
我正在Visual Studio 2012上使用OpenCV2.4.5和OpenNI2.0(带有SDK Kinect 1.6)。我尝试开发凝视跟踪应用程序,因为我使用“Kinect传感器”获取imag
我尝试将黑白 UIImage 转换为 IplImage,但从控制台提供这些。可以做什么? CGBitmapContextCreate: unsupported parameter combinatio
我是一名优秀的程序员,十分优秀!