矩阵与图像(二)

有关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);  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值