本文将带您了解关于opencv的图象格式IplImage和CBitmap的转换的新内容,同时我们还将为您解释opencv图像格式转换的相关知识,另外,我们还将为您提供关于android–删除Glide
本文将带您了解关于opencv的图象格式IplImage 和CBitmap的转换的新内容,同时我们还将为您解释opencv图像格式转换的相关知识,另外,我们还将为您提供关于android – 删除Glide设置的图像并使用imageView.setImageBitmap()、android-imageView.setImageBitmap(Bitmap)极大地减慢了我的应用程序、AndroidStudio OpenCv的配置,不用安装opencv manager、Bitmap 与 IplImage 之间的转换的实用信息。
本文目录一览:- opencv的图象格式IplImage 和CBitmap的转换(opencv图像格式转换)
- android – 删除Glide设置的图像并使用imageView.setImageBitmap()
- android-imageView.setImageBitmap(Bitmap)极大地减慢了我的应用程序
- AndroidStudio OpenCv的配置,不用安装opencv manager
- Bitmap 与 IplImage 之间的转换
opencv的图象格式IplImage 和CBitmap的转换(opencv图像格式转换)
- BOOL IplImage2Bmp(HDC dc,IplImage *pImage,CBitmap *bitmap)
- {
- if( pImage && pImage->depth == IPL_DEPTH_8U )
- {
- uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
- BITMAPINFO* bmi = (BITMAPINFO*)buffer;
- int bmp_w = pImage->width, bmp_h = pImage->height;
- //FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(), pImage->origin );
- int width=bmp_w;
- int height=bmp_h;
- int bpp=pImage ? (pImage->depth & 255)*pImage->nChannels : 0;
- int origin=pImage->origin;
- HBITMAP hBitmap;
- char* dst_data = 0;
- assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));
- BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
- memset( bmih, 0, sizeof(*bmih));
- bmih->biSize = sizeof(BITMAPINFOHEADER);
- bmih->biWidth = width;
- bmih->biHeight = origin ? abs(height) : -abs(height);
- bmih->biPlanes = 1;
- bmih->biBitCount = (unsigned short)bpp;
- bmih->biCompression = BI_RGB;
- if( bpp == 8 )
- {
- RGBQUAD* palette = bmi->bmiColors;
- int i;
- for( i = 0; i < 256; i++ )
- {
- palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
- palette[i].rgbReserved = 0;
- }
- }
- if(bitmap->m_hObject!=NULL)
- {
- bitmap->Detach();
- }
- hBitmap=CreateDIBitmap(dc,bmih,CBM_INIT,pImage->imageData,bmi,DIB_RGB_COLORS);
- bitmap->Attach(hBitmap);
- return TRUE;
- }
- return FALSE;
- }
android – 删除Glide设置的图像并使用imageView.setImageBitmap()
以下是我到目前为止所尝试的内容
onActivityResult()
@Override public void onActivityResult(int requestCode,int resultCode,Intent data) { super.onActivityResult(requestCode,resultCode,data); if (resultCode == Activity.RESULT_OK) { if (requestCode == SELECT_FILE) onSelectFromgalleryResult(data); else if (requestCode == REQUEST_CAMERA) // onCaptureImageResult((Bitmap) data.getExtras().get("data")); onCaptureImageResult(data); } } private void onCaptureImageResult(Intent data) { if (data != null) { mImageUri = Uri.parse("file://" + data.getStringExtra(CameraConfiguration.Arguments.FILE_PATH)); } try { bitmap_image = MediaStore.Images.Media.getBitmap(mContext.getContentResolver(),mImageUri); ByteArrayOutputStream bytes = new ByteArrayOutputStream(); bitmap_image.compress(Bitmap.CompressFormat.JPEG,60,bytes); bitmap_image = Bitmap.createScaledBitmap(bitmap_image,(int) (bitmap_image.getWidth() * 0.5),(int) (bitmap_image.getHeight() * 0.5),true); ExifInterface ei = new ExifInterface(data.getStringExtra(CameraConfiguration.Arguments.FILE_PATH)); int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION,ExifInterface.ORIENTATION_UNDEFINED); switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_90: bitmap_image = (SnappyUtils.rotateImage(bitmap_image,90)); break; case ExifInterface.ORIENTATION_ROTATE_180: bitmap_image = (SnappyUtils.rotateImage(bitmap_image,180)); break; case ExifInterface.ORIENTATION_ROTATE_270: bitmap_image = (SnappyUtils.rotateImage(bitmap_image,270)); break; case ExifInterface.ORIENTATION_norMAL: default: break; } } catch (IOException e) { e.printstacktrace(); Log.d("exception",e.toString()); } ////////////////////// it is showing on iv_logo2 as expected as it does not has anything set by glide////////////////////////////////////////////////////////////////// iv_logo.setBackground(null); iv_logo.setimageBitmap(bitmap_image); iv_logo2.setimageBitmap(bitmap_image); ///////////////////////////tried added this by seeing other SO posts ////////////////////////////////////////////////////////////////// Glide.with(mContext) .load(mImageUri) .signature(new StringSignature(String.valueOf(System.currentTimeMillis()))) .diskCacheStrategy(diskCacheStrategy.NONE) .skipMemoryCache(true) .into(iv_logo); }
另请注意,这与删除Glide的缓存不同
解决方法
asynchtask下载图片
private class Getimages extends AsyncTask<Object,Object,Object> { private String requestUrl,imagename_; private ImageView view; private Bitmap bitmap; private FileOutputStream fos; private Getimages(String requestUrl,ImageView view,String _imagename_) { this.requestUrl = requestUrl; this.view = view; this.imagename_ = _imagename_; } @Override protected Object doInBackground(Object... objects) { try { URL url = new URL(requestUrl); URLConnection conn = url.openConnection(); bitmap = BitmapFactory.decodeStream(conn.getInputStream()); } catch (Exception ex) { ex.printstacktrace(); } return null; } @Override protected void onPostExecute(Object o) { view.setimageBitmap(bitmap); } }
android-imageView.setImageBitmap(Bitmap)极大地减慢了我的应用程序
我编写了一个小应用程序,该应用程序应显示一个转速表,该转速表通过蓝牙获取有关rpm的数据.当数据更改时,我旋转针头和其他一些imageViews以在屏幕上显示当前值.
旋转代码:
bMapRpm=bMapcanvasBackTacho.copy(bMapcanvasBackTacho.getConfig(), true);
canvasRpm.setBitmap(bMapRpm);
canvasRpm.save();
canvasRpm.rotate((float)Rpmdegree+(float)Rpmcurrentdegree,bMapRpm.getWidth()/2,bMapRpm.getHeight()/2);
canvasRpm.drawBitmap(bMapNadel,0,0,paint);
canvasRpm.restore();
bMapcanvasBackTacho只是透明的背景.
bMapNadel是针的位图.
bMapRpm是要绘制的画布的位图
更新我一直调用的imageView:
ivNadel.setimageBitmap(bMapRpm);
我尝试通过注释掉部分代码来尝试使应用程序变慢.
在将setimageBitmap()注释掉后,速度消失了.
有人知道如何以其他方式更新imageView还是我可以更改以使其更快地工作?
thx =)
解决方法:
您可以做两件事:
首先,不要在每次需要更新位图时都调用copy(),这会创建一个新的位图,并且会浪费时间和内存.
其次,在ImageView上调用invalidate().这将通知View某些更改,并且重新绘制自身,而不必完全替换位图时更新其他任何事情.
最后,您甚至可能想要创建自己的View实现,以便可以重写onDraw()并在那里进行旋转.
AndroidStudio OpenCv的配置,不用安装opencv manager
按照以下操作步骤配置并测试了,没问题。
-
下载OpenCV sdk for Android,解压(我的解压地址是F:\OpenCV-android-sdk)
-
1)新建项目项目,取名为Opencvtest(名字随便取)
2)Minimum SDK 选择 API 19:Android 4.4 (KitKat)
3)选择Empty Activity
-
Android Studio菜单-->File-->New-->Import Module
1)选择F:\OpenCV-android-sdk/sdk/java
2)Module name: Android studio会自动填充这项为openCVLibrary310 ,不用管它.
3)点击下一步,会出现三个复选框,都选上,点击Finish
-
1)File-->Project Structure
2)左边Modules栏下选择app
3)在右边上面一栏中选择Dependencies
4)点击右边栏中的“+”,选择第三个Module Dependency
5)点击ok退出,然后再点击ok退出
-
1)将视图由Android切换到Project,如图所示
2)点击app,打开app根目录下的build.gradle文件,记下
compileSdkVersion
buildToolsVersion
minSdkVersion
targetSdkVersion
后面的数值
3)点击openCVLibrary310,打开根目录下的build.gradle文件,把文件中
compileSdkVersion
buildToolsVersion
minSdkVersion
targetSdkVersion
后的数值改成app中一样的
4)点击上方Gradle project sync一行中的Try Again
-
1)把OpenCV sdk for Android文件下F:\OpenCV-android-sdk\sdk\native下的libs文件夹拷贝到你的安卓项目下,即Opencvtest\app\src\main下面,并且将libs改名为jniLibs
2)此时前期准备工作就完成了,接下来可以用opencv中程序测试下
3)打开你的主活动MainActivity.java文件,记下包名,我的是
package com.xiaoma.opencvtest;,则我的包名就是com.xiaoma.opencvtest
-
1)将OpenCV-android-sdk\samples\image-manipulations\res中的三个文件(如图所示),拷贝到你的安卓项目Opencvtest\app\src\main\res下(拷贝前先将此目录下的同名的三个文件删掉)
2)将OpenCV-android-sdk\samples\image-manipulations中的AndroidManifest.xml文件,拷贝到你的安卓项目Opencvtest\app\src\main下替换
3)将OpenCV-android-sdk\samples\image-manipulations\src\org\opencv\samples\imagemanipulations中的ImageManipulationsActivity.java文件,拷贝到你的安卓项目Opencvtest\app\src\main\java\com\xiaoma\opencvtest下,并且把原来的MainActivity.java文件删掉。其中\com\xiaoma\这段根据每个人的包名不同会不一样
-
1)在Android Studio中打开ImageManipulationsActivity.java,AndroidManifest.xml
2)把文件中的包名,换成第六步骤中你记下的包名
3)AndroidManifest.xml文件下的的uses-sdk android:minSdkVersion的值改成第五步骤中记下的值
4)注意这一步在改AndroidManifest.xml文件中的包名时不要把原来的“”给粘贴没了
-
有些手机运行时可能会弹出
It seems that you device does not support camera(or it is locked).Application will be closed.
这时候打开手机应用权限管理,找到该程序应用,把它的相机的权限改为允许就可以了
Bitmap 与 IplImage 之间的转换
- //Karl_bmp.h
- //1.IplImage 2 CBitmap
- CBitmap * IplImage2CBitmap(const IplImage *pImage)
- {
- if( pImage && pImage->depth == IPL_DEPTH_8U )
- {
- HDC hDC=GetDC()->GetSafeHdc();
- uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];
- BITMAPINFO* bmi = (BITMAPINFO*)buffer;
- int bmp_w = pImage->width, bmp_h = pImage->height;
- FillBitmapInfo( bmi, bmp_w, bmp_h, pImage->depth*pImage->nChannels, pImage->origin );
- char *pBits=NULL;
- HBITMAP hBitmap=CreateDIBSection(hDC,bmi,DIB_RGB_COLORS,(void**)&pBits,NULL,0);
- memcpy(pBits,pImage->imageData,pImage->imageSize);
- CBitmap *pBitmap=new CBitmap;
- pBitmap->Attach(hBitmap);
- return pBitmap;
- }
- else
- return NULL;
- }
- void FillBitmapInfo( BITMAPINFO* bmi, int width, int height, int bpp, int origin)
- {
- assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));
- BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);
- memset( bmih, 0, sizeof(*bmih));
- bmih->biSize = sizeof(BITMAPINFOHEADER);
- bmih->biWidth = width;
- bmih->biHeight = origin ? abs(height) : -abs(height);
- bmih->biPlanes = 1;
- bmih->biBitCount = (unsigned short)bpp;
- bmih->biCompression = BI_RGB;
- if( bpp == 8 )
- {
- RGBQUAD* palette = bmi->bmiColors;
- int i;
- for( i = 0; i < 256; i++ )
- {
- palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;
- palette[i].rgbReserved = 0;
- }
- }
- }
- //2.CBitmap 2 IplImage
- IplImage *CBitmap2IplImage(const CBitmap *pBitmap)
- {
- DIBSECTION ds;
- pBitmap->GetObject(sizeof(ds),&ds);
- IplImage *pImage=cvCreateImage(cvSize(ds.dsBm.bmWidth,ds.dsBm.bmHeight),8,ds.dsBmih.biBitCount/8);
- memcpy(pImage->imageData,ds.dsBm.bmBits,pImage->imageSize);
- return pImage;
- }
- //3.HBITMAP 2 IplImage
- IplImage* hBitmap2Ipl(HBITMAP hBmp)
- {
- BITMAP bmp;
- ::GetObject(hBmp,sizeof(BITMAP),&bmp);//hBmp-->bmp
- int nChannels = bmp.bmBitsPixel == 1 ? 1 : bmp.bmBitsPixel/8 ;
- int depth = bmp.bmBitsPixel == 1 ? IPL_DEPTH_1U : IPL_DEPTH_8U;
- IplImage* img = cvCreateImage(cvSize(bmp.bmWidth,bmp.bmHeight),depth,nChannels); //cvCreateImageHeader
- //pBuffer = (char*)malloc(bmp.bmHeight*bmp.bmWidth*nChannels*sizeof(char));
- memcpy(img->imageData,(char*)(bmp.bmBits),bmp.bmHeight*bmp.bmWidth*nChannels);
- IplImage *dst = cvCreateImage(cvGetSize(img),img->depth,3);
- cvCvtColor(img,dst,CV_BGRA2BGR);
- cvReleaseImage(&img);
- return dst;
- }
- //4.IplImage 2 HBITMAP
- HBITMAP IplImage2hBitmap(IplImage* pImg)
- {
- BYTE tmp[sizeof(BITMAPINFO)+1024];
- BITMAPINFO *bmi = (BITMAPINFO*)tmp;
- HBITMAP hBmp;
- int i;
- memset(bmi,0,sizeof(BITMAPINFO));
- bmi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
- bmi->bmiHeader.biWidth = pImg->width;
- bmi->bmiHeader.biHeight = pImg->height;
- bmi->bmiHeader.biPlanes = 1;
- bmi->bmiHeader.biBitCount = pImg->nChannels * pImg->depth;
- bmi->bmiHeader.biCompression = BI_RGB;
- bmi->bmiHeader.biSizeImage = 0;//if biCompression is BI_RGB,this can be 0
- bmi->bmiHeader.biClrImportant =0 ;
- switch(pImg->nChannels * pImg->depth)
- {
- case 8 :
- for(i=0 ; i < 256 ; i++){
- bmi->bmiColors[i].rgbBlue = i;
- bmi->bmiColors[i].rgbGreen= i;
- bmi->bmiColors[i].rgbRed= i;
- }
- break;
- case 32:
- case 24:
- ((DWORD*) bmi->bmiColors)[0] = 0x00FF0000;
- ((DWORD*) bmi->bmiColors)[1] = 0x0000FF00;
- ((DWORD*) bmi->bmiColors)[2] = 0x000000FF;
- break;
- }
- hBmp = ::CreateDIBSection(NULL,bmi,DIB_RGB_COLORS,NULL,0,0);
- SetDIBits(NULL,hBmp,0,pImg->height,pImg->imageData,bmi,DIB_RGB_COLORS);
- return hBmp;
- }
- //5.HBITMAP 2 CBitmap
- CBitmap HBITMAP2CBitmap(HBITMAP hbitmap)
- {
- CBitmap cbitmap;
- cbitmap.Attach(hbitmap);
- return cbitmap;
- }
- 6.CBitmap 2 HBITMAP
- HBITMAP CBitmap2HBITMAP(CBitmap bitmap )
- {
- HBITMAP bmp = HBITMAP(bitmap);
- //bmp=(HBITMAP)bitmap.GetSafeHandle();
- return bmp;
- }
- //7.BITMAP 2 CBitmap
- CBitmap BITMAP2CBitmap(BITMAP bmp)
- {
- CBitmap bitmap;
- bitmap.GetBitmap(&bmp);
- return bitmap;
- }
- //8.HBITMAP 2 BITMAP
- BITMAP HBITMAP2BITMAP(HBITMAP hBmp)
- {
- BITMAP bmp;
- ::GetObject(hBmp,sizeof(BITMAP),&bmp);//
- return bmp;
- }
Bitmap 转为 iplimage 代码
- IplImage* BitmapToIplImage(HBITMAP hBmp)
- {
- BITMAP bmp;
- GetObject(hBmp, sizeof(BITMAP), &bmp);
- int depth = (bmp.bmBitsPixel == 1) ? IPL_DEPTH_1U : IPL_DEPTH_8U;
- int nChannels = (bmp.bmBitsPixel == 1) ? 1 : bmp.bmBitsPixel/8;
- IplImage* img = cvCreateImage(cvSize(bmp.bmWidth,bmp.bmHeight), depth, nChannels);
- BYTE *pBuffer = new BYTE[bmp.bmHeight*bmp.bmWidth*nChannels];
- GetBitmapBits(hBmp, bmp.bmHeight*bmp.bmWidth*nChannels, pBuffer);
- memcpy(img->imageData, pBuffer, bmp.bmHeight*bmp.bmWidth*nChannels);
- delete pBuffer;
- IplImage *dst = cvCreateImage(cvGetSize(img), img->depth,3);
- cvCvtColor(img, dst, CV_BGRA2BGR);
- cvReleaseImage(&img);
- return dst;
- }
如果要从 CBitmap 转为 IplImage,可以先将 CBitmap 转为 BITMAP,再由 BITMAP 转为 IplImage;
Cbitmap 转为 bitmap 代码
- // CBitmap 转为 BITMAP
- CBitmap bitmap;
- bitmap.LoadBitmap(IDB_BITMAP);
- BITMAP bmp;
- bitmap.GetBitmap(&bmp);
- // CBitmap 与 HBITMAP 间的转换
- // CBitmap 转为 HBITMAP
- CBitmap bitmap;
- bitmap.LoadBitmap(IDB_BITMAP);
- HBITMAP bmp = HBITMAP(bitmap);
- // HBITMAP 转为 CBitmap
- HBITMAP hbitmap;
- CBitmap bitmap;
- bitmap.Attach(hbitmap);
关于opencv的图象格式IplImage 和CBitmap的转换和opencv图像格式转换的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android – 删除Glide设置的图像并使用imageView.setImageBitmap()、android-imageView.setImageBitmap(Bitmap)极大地减慢了我的应用程序、AndroidStudio OpenCv的配置,不用安装opencv manager、Bitmap 与 IplImage 之间的转换等相关内容,可以在本站寻找。
本文标签: