代码片段~

unsigned int* abMatBGR2ARGB(Mat imag)
{
  int nCols;
  int nRows;
  unsigned int *pbuff = NULL;
  if(imag.empty())
  {
    cerr << "Failed read the image data." << endl;
    return NULL;
  }
  if (imag.dims != 2)
  {
    cerr << "not a image data" << endl;
    return NULL;
  }
  nCols = imag.cols;
  nRows = imag.rows;
  pbuff = new unsigned int[nCols*nRows];
  if (!pbuff)
  {
    cerr << "failed to allocate memory for the input image." << endl;
    return NULL;
  }

  if (imag.depth()!=CV_8U || imag.channels() != 3)
  {
    cerr << "error type of image channels and depth." << endl;
    return NULL;
  }
  Vec3b pix;
  uchar *tp=NULL;
  for (int row = 0; row < nRows; row++)
  {
    for (int col = 0; col < nCols; col++)
    {
      pix = imag.at<Vec3b>(row, col);
      tp = (uchar*)(pbuff + row*nCols + col);
      tp[0] = 0;//A
      tp[1] = pix[2];//R
      tp[2] = pix[1];//G
      tp[3] = pix[0];//B
    }
  }
  return pbuff;
}

void abARGB2MatBGR(unsigned int *pbuff, int nRows, int nCols, Mat &imag)
{
  uchar *tp=NULL;
  imag.create(nRows, nCols, CV_8UC3);
  for (int row = 0; row < nRows; row++)
  {
    for (int col = 0; col < nCols; col++)
    {
      tp = (uchar*)(pbuff + row*nCols + col);
      imag.at<Vec3b>(row, col)[0] = tp[3];
      imag.at<Vec3b>(row, col)[1] = tp[2];
      imag.at<Vec3b>(row, col)[2] = tp[1];
    }
  }
}

测试代码:

#include <iostream>
#include <cmath>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

unsigned int* abMatBGR2ARGB(Mat imag)
{
  int nCols;
  int nRows;
  unsigned int *pbuff = NULL;
  if(imag.empty())
  {
    cerr << "Failed read the image data." << endl;
    return NULL;
  }
  if (imag.dims != 2)
  {
    cerr << "not a image data" << endl;
    return NULL;
  }
  nCols = imag.cols;
  nRows = imag.rows;
  pbuff = new unsigned int[nCols*nRows];
  if (!pbuff)
  {
    cerr << "failed to allocate memory for the input image." << endl;
    return NULL;
  }

  if (imag.depth()!=CV_8U || imag.channels() != 3)
  {
    cerr << "error type of image channels and depth." << endl;
    return NULL;
  }
  Vec3b pix;
  uchar *tp=NULL;
  for (int row = 0; row < nRows; row++)
  {
    for (int col = 0; col < nCols; col++)
    {
      pix = imag.at<Vec3b>(row, col);
      tp = (uchar*)(pbuff + row*nCols + col);
      tp[0] = 0;//A
      tp[1] = pix[2];//R
      tp[2] = pix[1];//G
      tp[3] = pix[0];//B
    }
  }
  return pbuff;
}

void abARGB2MatBGR(unsigned int *pbuff, int nRows, int nCols, Mat &imag)
{
  uchar *tp=NULL;
  imag.create(nRows, nCols, CV_8UC3);
  for (int row = 0; row < nRows; row++)
  {
    for (int col = 0; col < nCols; col++)
    {
      tp = (uchar*)(pbuff + row*nCols + col);
      imag.at<Vec3b>(row, col)[0] = tp[3];
      imag.at<Vec3b>(row, col)[1] = tp[2];
      imag.at<Vec3b>(row, col)[2] = tp[1];
    }
  }
}

int main()
{
	Mat im = imread("../opencvt.jpeg");
	if (im.empty())
	{
		cerr << "empty" << endl;
		return -1;
	}
	imshow("org", im);
	cvWaitKey();

	unsigned int *pbuff = NULL;
	pbuff = abMatBGR2ARGB(im);

	Mat nIm;
	abARGB2MatBGR(pbuff, im.rows, im.cols, nIm);

	imshow("new", nIm);
	cvWaitKey();

	delete[] pbuff;

	return 0;
}

OpenCV, MatBGR2ARGB, ARGB2MatBGR的更多相关文章

  1. opencv在图像显示中文

    在图像定位和模式识别时,经常需要把结果标注到图片上,标注内容可以是数字字母.矩形框等(opencv支持的)或者是中文汉字(借助freetype). 1.显示数字/矩形框 #include <op ...

  2. opencv中Mat与IplImage,CVMat类型之间转换

    opencv中对图像的处理是最基本的操作,一般的图像类型为IplImage类型,但是当我们对图像进行处理的时候,多数都是对像素矩阵进行处理,所以这三个类型之间的转换会对我们的工作带来便利. Mat类型 ...

  3. opencv源码:cascadedetect

    级联分类器检测类CascadeClassifier,提供了两个重要的方法: CascadeClassifier cascade_classifier; cascade_classifier.load( ...

  4. 基于OpenCV的车辆检测与追踪的实现

    最近老师布置了一个作业,是做一个基于视频的车辆检测与追踪,用了大概两周的时间做了一个简单的,效果不是很理想,但抑制不住想把自己的一些认识写下来,这里就把一些网络上的博客整理一下分享给大家,希望帮助到大 ...

  5. OpenCV人脸识别Eigen算法源码分析

    1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...

  6. OpenCV人脸识别LBPH算法源码分析

    1 背景及理论基础 人脸识别是指将一个需要识别的人脸和人脸库中的某个人脸对应起来(类似于指纹识别),目的是完成识别功能,该术语需要和人脸检测进行区分,人脸检测是在一张图片中把人脸定位出来,完成的是搜寻 ...

  7. OpenCV模板匹配算法详解

    1 理论介绍 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标.OpenCV ...

  8. android studio 使用 jni 编译 opencv 完整实例 之 图像边缘检测!从此在andrid中自由使用 图像匹配、识别、检测

    目录: 1,过程感慨: 2,运行环境: 3,准备工作: 4,编译 .so 5,遇到的关键问题及其解决方法 6,实现效果截图. (原创:转载声明出处:http://www.cnblogs.com/lin ...

  9. 海康网络摄像机YV12转换为BGR,由opencv Mat显示 (转)

    我使用的是海康DS-2CD852MF-E, 200万,网络摄像机,已经比较老了,不过SDK在海康官网下载的,开发流程都差不多. 海康摄像机回调解码后的视频数据格式为YV12,顺便说一下YV12的数据格 ...

随机推荐

  1. github的简单使用

    查了好多入门教程(图文并茂可以了解一些基本步骤),感觉逻辑欠缺,(很多东西跟着教程了解会用了,不了解逻辑,只是会了这一个,其他的还是很蒙),来一起理一理把 1.第一步下载并注册(这个自己解决) 2.用 ...

  2. [CTSC 1999]拯救大兵瑞恩&[网络流24题]孤岛营救问题

    Description $1944$ 年,特种兵麦克接到国防部的命令,要求立即赶赴太平洋上的一个孤岛,营救被敌军俘虏的大兵瑞恩.瑞恩被关押在一个迷宫里,迷宫地形复杂,但幸好麦克得到了迷宫的地形图.迷宫 ...

  3. 2015多校联赛 ——HDU5288(数学)

    OO’s Sequence Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) ...

  4. 棋盘 chess

    Description 给出一张 n × n 的棋盘,格子有黑有白.现在要在棋盘上放棋子,要求: • 黑格子上不能有棋子 • 每行每列至多只有一枚棋子 你的任务是求出有多少种合法的摆放方案.答案模 1 ...

  5. ●BZOJ 2251 [2010Beijing Wc]外星联络

    题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2251 题解: 后缀数组,倍增,RMQ 题意:把重复次数超过 1次的子串按字典序输出它们重复的 ...

  6. hdu 5430(几何)

    题意:求光在圆内反射n次后第一次返回原点的方案数 如果k和n-1可约分,则表明是循环多次反射方案才返回原点. #include <iostream> #include <cstrin ...

  7. [UOJ UR #4追击圣诞老人]

    来自FallDream的博客,未经允许,请勿转载, 谢谢. 传送门 考虑直接维护一个堆,然后往里面丢链,并且取出k个堆顶就行了. 然后就需要分类讨论啥的,给你的三个点变成两条链,每次取出一条链之后选择 ...

  8. bzoj2442[Usaco2011 Open]修剪草坪 单调队列优化dp

    2442: [Usaco2011 Open]修剪草坪 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1159  Solved: 593[Submit] ...

  9. bzoj3211花神游历各国 线段树

    3211: 花神游历各国 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 4252  Solved: 1547[Submit][Status][Discu ...

  10. centos下 apache+mysql+php的安装

    一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysql mysql-server 安装完毕,让 MySQ ...