有关iplimage和mat矩阵的一个问题:
cvSize(int width,int height) //函数原型
Mat mat_name(int rows,int cols,type,color) //注意与上面的cvsize刚好相反
CvPoint(int x,int y)在iplimage中是第x列的第y行个点。
eg3_6
题目要求:为一幅图像创建多个图像头。新图像头的长宽分别为20、30.imagedate分别指向像素(5,10),(50,60)。再用cvNot函数求反,多个图像头指向的是同一数据,因此就是在原图像上求的反。
本题帮助理解cvCreateImageHeader函数以及IplImage头的格式。
#include"cv.h"
#include"highgui.h"
int main(int argc,char** argv)
{
IplImage* img=cvLoadImage("C:\\Users\\dell\\Desktop\\test.jpg",1);
IplImage* img1=cvCreateImageHeader(cvSize(20,30),img->depth,img->nChannels);
img1->widthStep=img->widthStep;
img1->origin=img->origin;
img1->imageData=img->imageData+4*img->widthStep+9*sizeof(img->depth)*img->nChannels+1;
//IPL_ORIGIN_TL与IPL_ORIGIN_BL分别设置坐标原点为左上角和左下角。
IplImage* img2=cvCreateImageHeader(cvSize(20,30),img->depth,img->nChannels);
img2->widthStep=img->widthStep;
img2->origin=img->origin;
img2->imageData=img->imageData+49*img->widthStep+59*sizeof(img->depth)*img->nChannels+1;
cvNot(img1,img1);//直接在img1上修改,也就是在原图像img上修改,求反
cvNot(img2,img2);
cvNamedWindow("example1",1);
cvShowImage("example1",img);
cvWaitKey(0);
cvReleaseImage(&img1);
cvReleaseImage(&img2);
cvReleaseImage(&img);
cvDestroyWindow("example1");
}
eg3_7
(1)cvCopy与cvCloneImage的区别
cvCloneImage:使用前不必自己开创一段内存;复制时将设置的ROI区域也可以拷贝过来;复制后若原图像消失了,则克隆后的图像也改变了。
cvCopy:使用前要自己开创一段内存;复制时只复制ROI区域内的图片;复制后原图像消失了,复制后的图像不变。
#include"cv.h"
#include"highgui.h"
#include<iostream>
using namespace std;
int main(int argc,char** argv)
{
IplImage* img=cvLoadImage("C:\\Users\\dell\\Desktop\\test.jpg",1);
IplImage* dst0=cvCreateImage(cvGetSize(img),img->depth,1);
IplImage* dst1=cvCreateImage(cvGetSize(img),img->depth,1);
IplImage* dst2=cvCreateImage(cvGetSize(img),img->depth,1);
cvSplit(img,dst0,dst1,dst2,NULL);//各分量的排列顺序为BGR
cvNamedWindow("imgGreen_pre",1);
cvShowImage("imgGreen_pre",dst1);
IplImage*clone1=cvCloneImage(dst1);
IplImage*clone2=cvCloneImage(dst1);
double MaxNum,MinNum;
cvMinMaxLoc(dst1,&MinNum,&MaxNum,NULL,NULL,NULL);
cout<<"MinNum in green_img:"<<MinNum<<endl;
cout<<"MaxNum in green_img:"<<MaxNum<<endl;
unsigned char thresh=unsigned char((MaxNum-MinNum)/2);
cvSet(clone1,cvScalar(thresh));
cvZero(clone2);
cvCmp(dst1,clone1,clone2,CV_CMP_GE);//clone2此时成为一个绿色图像中像素超过thresh的掩码图像
cvSubS(dst1,cvScalar(thresh),dst1,clone2);//绿色图像中像素超过thresh的像素减去thresh,其余不变。即mask图像中像素为0的对应位置不变。
cvNamedWindow("imgGreen_after",CV_WINDOW_AUTOSIZE);
cvShowImage("imgGreen_after",dst1);
cvWaitKey(0);
cvReleaseImage(&img);
cvReleaseImage(&dst1);
cvDestroyWindow("imgGreen_pre");
cvReleaseImage(&clone2);
cvDestroyWindow("imgGreen_after");
}
eg3_8 文件的读取和写入
#include "opencv\cv.h"
#include "opencv\highgui.h"
#include <iostream>
using namespace std;
typedef struct{
int i;
CvPoint pt;
CvRect rect;
}my_struct;
void write_my_struct(
CvFileStorage *fs,
const char *name,
my_struct *ms){
assert(fs != 0);
cvWriteInt(fs,"i",ms ->i);
cvStartWriteStruct(fs,"pt",CV_NODE_SEQ);
cvWriteInt(fs,0,ms ->pt.x);
cvWriteInt(fs,0,ms ->pt.y);
cvEndWriteStruct(fs);
cvStartWriteStruct(fs,"rect",CV_NODE_SEQ);
cvWriteInt(fs,0,ms ->rect.x);
cvWriteInt(fs,0,ms ->rect.y);
cvWriteInt(fs,0,ms ->rect.width);
cvWriteInt(fs,0,ms ->rect.height);
cvEndWriteStruct(fs);
}
void read_my_struct(
CvFileStorage *fs,
CvFileNode *ms_node,
my_struct *ms){
assert(fs != 0);
ms ->i = cvReadIntByName(fs,0,"i",0);
CvSeq* s = cvGetFileNodeByName(fs,0,"pt") ->data.seq;
ms ->pt.x = cvReadInt((CvFileNode*)cvGetSeqElem(s,0));
ms ->pt.y = cvReadInt((CvFileNode*)cvGetSeqElem(s,1));
CvSeq* s1 = cvGetFileNodeByName(fs,0,"rect") ->data.seq;
ms ->rect.x = cvReadInt((CvFileNode*)cvGetSeqElem(s1,0));
ms ->rect.y = cvReadInt((CvFileNode*)cvGetSeqElem(s1,1));
ms ->rect.width = cvReadInt((CvFileNode*)cvGetSeqElem(s1,2));
ms ->rect.height = cvReadInt((CvFileNode*)cvGetSeqElem(s1,3));
//输出读取的结果
cout<<"my_struct:"<<endl;
cout<<"i:"<<ms ->i<<endl;
cout<<"pt:("<<ms ->pt.x<<","<<ms ->pt.y<<")"<<endl;
cout<<"rect:("<<ms ->rect.x<<","<<ms ->rect.y<<","<<
ms ->rect.width<<","<<ms ->rect.height<<endl;
}
int main(){
//往xml文件中写数据
CvFileStorage* fs = cvOpenFileStorage(
"cfg.xml",
0,
CV_STORAGE_WRITE);
my_struct ms;
ms.i = 100;
ms.pt.x = 10;
ms.pt.y = 20;
ms.rect.x = 30;
ms.rect.y = 40;
ms.rect.width = 50;
ms.rect.height = 60;
write_my_struct(fs,NULL,&ms);
cvReleaseFileStorage(&fs);
//往xml文件中读数据
CvFileStorage* fs1 = cvOpenFileStorage(
"cfg.xml",
0,
CV_STORAGE_READ);
my_struct ms1;
read_my_struct(fs1,NULL,&ms1);
cvReleaseFileStorage(&fs1);
}