GVKun编程网logo

opencv的图象格式IplImage 和CBitmap的转换(opencv图像格式转换)

16

本文将带您了解关于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图像格式转换)

opencv的图象格式IplImage 和CBitmap的转换(opencv图像格式转换)


          http://www.voidcn.com/article/p-uuoyvzxr-hn.html    
分类: opencv 2012-05-08 16:46 774人阅读 评论(1) 收藏 举报
colors buffer dst byte null bi
[cpp] view plain copy print ?
  1.  BOOL IplImage2Bmp(HDC dc,IplImage *pImage,CBitmap *bitmap)  
  2. {  
  3.  if( pImage && pImage->depth == IPL_DEPTH_8U )  
  4.     {  
  5.         uchar buffer[sizeof(BITMAPINFOHEADER) + 1024];  
  6.         BITMAPINFO* bmi = (BITMAPINFO*)buffer;  
  7.         int bmp_w = pImage->width, bmp_h = pImage->height;  
  8.    
  9.         //FillBitmapInfo( bmi, bmp_w, bmp_h, Bpp(), pImage->origin );  
  10.   int width=bmp_w;  
  11.   int height=bmp_h;  
  12.   int bpp=pImage ? (pImage->depth & 255)*pImage->nChannels : 0;  
  13.   int origin=pImage->origin;  
  14.   HBITMAP hBitmap;  
  15.   char* dst_data = 0;  
  16.    
  17.   assert( bmi && width >= 0 && height >= 0 && (bpp == 8 || bpp == 24 || bpp == 32));  
  18.    
  19.   BITMAPINFOHEADER* bmih = &(bmi->bmiHeader);  
  20.    
  21.   memset( bmih, 0, sizeof(*bmih));  
  22.   bmih->biSize = sizeof(BITMAPINFOHEADER);  
  23.   bmih->biWidth = width;  
  24.   bmih->biHeight = origin ? abs(height) : -abs(height);  
  25.   bmih->biPlanes = 1;  
  26.   bmih->biBitCount = (unsigned short)bpp;  
  27.   bmih->biCompression = BI_RGB;  
  28.    
  29.   if( bpp == 8 )  
  30.   {  
  31.    RGBQUAD* palette = bmi->bmiColors;  
  32.    int i;  
  33.    for( i = 0; i < 256; i++ )  
  34.    {  
  35.     palette[i].rgbBlue = palette[i].rgbGreen = palette[i].rgbRed = (BYTE)i;  
  36.     palette[i].rgbReserved = 0;  
  37.    }  
  38.   }  
  39.   if(bitmap->m_hObject!=NULL)  
  40.   {  
  41.    bitmap->Detach();  
  42.   }  
  43.   hBitmap=CreateDIBitmap(dc,bmih,CBM_INIT,pImage->imageData,bmi,DIB_RGB_COLORS);  
  44.   bitmap->Attach(hBitmap);  
  45.   return TRUE;  
  46.     }  
  47.  return FALSE;  
  48.    
  49. }  

android – 删除Glide设置的图像并使用imageView.setImageBitmap()

android – 删除Glide设置的图像并使用imageView.setImageBitmap()

我有一个片段,首先使用Glide将图像设置为imageView(从互联网上获取图像网址).然后在点击图像视图时,可以从图库或相机意图中选择新图像.问题是当我尝试设置从OnActivityResult()获得的位图时.图像实际上设置但滑动重叠.我需要显示从相机/画廊捕获的图像.任何帮助表示赞赏,如果可以使用毕加索或任何其他图书馆完成,请提出建议.
  以下是我到目前为止所尝试的内容

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的缓存不同

解决方法

花了很多时间搞清楚如何删除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)极大地减慢了我的应用程序

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

AndroidStudio OpenCv的配置,不用安装opencv manager

按照以下操作步骤配置并测试了,没问题。

  1. 下载OpenCV sdk for Android,解压(我的解压地址是F:\OpenCV-android-sdk)

  2. 1)新建项目项目,取名为Opencvtest(名字随便取)

    2)Minimum SDK 选择 API 19:Android 4.4 (KitKat)

    3)选择Empty Activity

    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
  3. Android Studio菜单-->File-->New-->Import Module

    1)选择F:\OpenCV-android-sdk/sdk/java

    2)Module name: Android studio会自动填充这项为openCVLibrary310 ,不用管它.

    3)点击下一步,会出现三个复选框,都选上,点击Finish

    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
  4. 1)File-->Project Structure

    2)左边Modules栏下选择app

    3)在右边上面一栏中选择Dependencies 

    4)点击右边栏中的“+”,选择第三个Module Dependency

    5)点击ok退出,然后再点击ok退出

    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
  5. 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

    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
  6. 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

    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
    Android Studio不安装opencv manager配置
  7. 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\这段根据每个人的包名不同会不一样

    Android Studio不安装opencv manager配置
  8. 1)在Android Studio中打开ImageManipulationsActivity.java,AndroidManifest.xml

    2)把文件中的包名,换成第六步骤中你记下的包名

    3)AndroidManifest.xml文件下的的uses-sdk android:minSdkVersion的值改成第五步骤中记下的值 

    4)注意这一步在改AndroidManifest.xml文件中的包名时不要把原来的“”给粘贴没了

    Android Studio不安装opencv manager配置
  9. 有些手机运行时可能会弹出

    It seems that you device does not support camera(or it is locked).Application will be closed.

    这时候打开手机应用权限管理,找到该程序应用,把它的相机的权限改为允许就可以了

Bitmap 与 IplImage 之间的转换

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 代码 复制代码 收藏代码

  1. IplImage* BitmapToIplImage(HBITMAP hBmp)   
  2. {   
  3.     BITMAP bmp;       
  4.        
  5.     GetObject(hBmp, sizeof(BITMAP), &bmp);   
  6.     int depth     = (bmp.bmBitsPixel == 1) ? IPL_DEPTH_1U : IPL_DEPTH_8U;   
  7.     int nChannels = (bmp.bmBitsPixel == 1) ? 1 : bmp.bmBitsPixel/8;       
  8.        
  9.     IplImage* img = cvCreateImage(cvSize(bmp.bmWidth,bmp.bmHeight), depth, nChannels);     
  10.        
  11.     BYTE *pBuffer = new BYTE[bmp.bmHeight*bmp.bmWidth*nChannels];       
  12.     GetBitmapBits(hBmp, bmp.bmHeight*bmp.bmWidth*nChannels, pBuffer);   
  13.     memcpy(img->imageData, pBuffer, bmp.bmHeight*bmp.bmWidth*nChannels);      
  14.     delete pBuffer;   
  15.   
  16.     IplImage *dst = cvCreateImage(cvGetSize(img), img->depth,3);       
  17.     cvCvtColor(img, dst, CV_BGRA2BGR);      
  18.     cvReleaseImage(&img);      
  19.     return dst;   
  20. }  

 如果要从 CBitmap 转为 IplImage,可以先将 CBitmap 转为 BITMAP,再由 BITMAP 转为 IplImage;

Cbitmap 转为 bitmap 代码 复制代码 收藏代码

  1. // CBitmap 转为 BITMAP   
  2. CBitmap bitmap;   
  3. bitmap.LoadBitmap(IDB_BITMAP);   
  4. BITMAP   bmp;   
  5. bitmap.GetBitmap(&bmp);   
  6.   
  7. // CBitmap 与 HBITMAP 间的转换   
  8. // CBitmap 转为 HBITMAP   
  9. CBitmap bitmap;   
  10. bitmap.LoadBitmap(IDB_BITMAP);   
  11. HBITMAP bmp = HBITMAP(bitmap);   
  12. // HBITMAP 转为 CBitmap   
  13. HBITMAP  hbitmap;     
  14. CBitmap   bitmap;   
  15. bitmap.Attach(hbitmap);  

关于opencv的图象格式IplImage 和CBitmap的转换opencv图像格式转换的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于android – 删除Glide设置的图像并使用imageView.setImageBitmap()、android-imageView.setImageBitmap(Bitmap)极大地减慢了我的应用程序、AndroidStudio OpenCv的配置,不用安装opencv manager、Bitmap 与 IplImage 之间的转换等相关内容,可以在本站寻找。

本文标签:

上一篇大数据处理之道 (htmlparser获取数据<一>)

下一篇机器学习中的相似性度量http://www.cnblogs.com/heaad/archive/2011/03/08/1977733.html