在学习opencv图像处理过程中总是遇到数据类型转换的错误提示;因为IplImage是OpenCV中C语言的图像类型;cv::Mat是OpenCV中C++语言的图像类型;所以再利用cv::Mat对图像进行处理的过程中应该注意其图像的数据类型。
1. cv::Mat -> IplImage
cv::Mat matimg = cv::imread ("imagename.jpg");
IplImage* iplimg;
*iplimg = IplImage(matimg);
2. IplImage -> cv::Mat
IplImage* iplimg = cvLoadImage("imagename.jpg");
cv::Mat matimg;
matimg = cv::Mat(iplimg);
为了更好的展示二者的区别,应用的实例如下(提取图像的r,g,b的值)。
#include "cv.h"
#include "highgui.h"
using namespace cv;
using namespace std;
int main(){
IplImage* img;
img = cvLoadImage("D:\\pictures\\lena.jpg");
IplImage* b_img = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
IplImage* g_img = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
IplImage* r_img = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
int x, y;
for (y = 0; y < img->height; y++)
{
unsigned char* prow = (unsigned char*)(img->imageData + y*img->widthStep);
unsigned char* brow = (unsigned char*)(b_img->imageData + y*b_img->widthStep);
unsigned char* grow = (unsigned char*)(g_img->imageData + y*g_img->widthStep);
unsigned char* rrow = (unsigned char*)(r_img->imageData + y*r_img->widthStep);
for (x = 0; x < img->width; x++)
{
brow[x] = prow[3 * x + 0];
grow[x] = prow[3 * x + 1];
rrow[x] = prow[3 * x + 2];
}
}
cvNamedWindow("原图");
cvShowImage("原图", img);
cvNamedWindow("b");
cvShowImage("b", b_img);
cvNamedWindow("r");
cvShowImage("r", r_img);
cvNamedWindow("g");
cvShowImage("g", g_img);
cvWaitKey(0);
return 0;
}
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main()
{
Mat orig;
orig = imread("D:\\pictures\\lena.jpg");
if (orig.empty())
cout << "读入失败" << endl;
imshow("original", orig);
vector<Mat>m;
split(orig, m); //提取通道信息,但是当未把其他通道设置为0时显示为灰度图,但各通道信息不同
vector<Mat>Rchannels, Gchannels, Bchannels;
//提取通道信息,把orig的通道数据复制到channals
split(orig, Rchannels);
split(orig, Gchannels);
split(orig, Bchannels);
//将其他通道信息设置为0
Rchannels[1] = 0;
Rchannels[2] = 0;
Gchannels[0] = 0;
Gchannels[2] = 0;
Bchannels[0] = 0;
Bchannels[1] = 0;
//合并通道信息
merge(Rchannels, m[0]);
merge(Gchannels, m[1]);
merge(Bchannels, m[2]);
//显示各通道信息
imshow("B", m[0]);
imshow("G", m[1]);
imshow("R", m[2]);
waitKey(0);
return 0;
}