/**
* 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不守规则了,也许是优化了,所谓的优化就是不守规则。
反正这段话我是没看懂。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)