在java中用iplimage要引入哪个头文件

在java中用iplimage要引入哪个头文件,第1张

代码简单,如下:

/**

* IplImage转化为Bitmap

* @param iplImage

* @return

*/

public Bitmap IplImageToBitmap(IplImage iplImage) {

Bitmap bitmap = null

bitmap = Bitmap.createBitmap(iplImage.width(), iplImage.height(),

Bitmap.Config.ARGB_8888)

bitmap.copyPixelsFromBuffer(iplImage.getByteBuffer())

return bitmap

}

/**

* Bitmap转化为IplImage

* @param bitmap

* @return

*/

public IplImage bitmapToIplImage(Bitmap bitmap) {

IplImage iplImage

iplImage = IplImage.create(bitmap.getWidth(), bitmap.getHeight(),

IPL_DEPTH_8U, 4)

bitmap.copyPixelsToBuffer(iplImage.getByteBuffer())

return iplImage

}

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

里面主要是用到了Bitmap的两个函数:

public void copyPixelsFromBuffer (Buffer src)

从buffer中复制点到Bitmap中,并且从初始位置开始会覆盖掉Bitmap中原来的点,复制过程中buffer的点不会以任何方式改变,不管原bitmap格式如何最终都会以32位的方式写入

public void copyPixelsToBuffer (Buffer dst)

将Bitmap中的点复制到指定的buffer当中,如果dst的空间不够大不能容下bitmap中的所有点,或者dst不是ByteBuffer, ShortBuffer, IntBuffer这三种之一,函数则会抛出异常

首先在自己的项目中添加CvvImage.h和CvvImage.cpp。在要使用的类中包含其头文件#include "CvvImage",接着添加如下消息处理函数:

void CPersonWidthDlg::showimg(void)

{

Mat img = imread(".\\lena.jpg")

IplImage iplImg = IplImage(img)

//Iplimage * iplImg = &img.operator IplImage()

CDC* pDC = GetDlgItem(IDC_FRAME)->GetDC()

HDC hdc = pDC->GetSafeHdc()

RECT rect

GetDlgItem(IDC_FRAME)->GetClientRect(&rect)

CvvImage cvvImg

cvvImg.CopyOf(&iplImg)

cvvImg.DrawToHDC(hdc,&rect)

ReleaseDC(pDC) 

}

MFC 微软基础类库(英语:Microsoft Foundation Classes,简称MFC)是微软公司提供的一个类库(class libraries),以C++类的形式封装了Windows API,并且包含一个应用程序框架,以减少应用程序开发人员的工作量。

其中包含大量Windows句柄封装类和很多Windows的内建控件和组件的封装类。

我也遇到了一样的问题 但是之前cvGetSize是能用的 。

我解决办法是用

CvSize size=cvSize((*src).width,(*src).height)

IplImage * hsv = cvCreateImage(size, 8,3)

替代。

原因的话不知道是不是http://www.opencv.org.cn/forum/viewtopic.php?f=1&t=3424里的这段话:

前段时间我把 .h头文件翻译成delphi的pas 文件时也遇到这个问题,通过调试时查看反汇编代码得到了答案

cvGetSize函数有1个参数,C里在返回值是结构体的时候,如果结构体只有2个以下字段,那么push了1个参数,返回值的第一个字段在eax里,第二个字段在edx里,如果返回值有4个以上的字段(3个字段的没找到,所以没测试),那么将push 2个参数,其中第1个参数是用来接收返回值的(从右往左压,也就是最后压入的参数),而不是通过寄存器返回

但是在delphi里(bcb应该一样),返回结构体的时候,无论几个字段,全部是使用增加一个参数接收返回值的方法,所以这个地方肯定出错

所以,如果返回的结构体时4个以上字段的,那么调用没有问题,因为规则相同了,其实我感觉这个地方C不守规则了,也许是优化了,所谓的优化就是不守规则。

反正这段话我是没看懂。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/11716804.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存