opencv学习笔记之三 IplImage结构体

NOTE 1   :vc中 sizeof(char) = 1  ;  sizeof(int) = 2 ;  sizeof(float) = 4 ;  sizeof(double) = 8 ;

按照字节显示,一字节是八位。

NOTE 2   :图像的深度表示图像存储每个单位像素所用的位数,colormap

#define IPL_DEPTH_1U     1
#define IPL_DEPTH_8U     8
#define IPL_DEPTH_16U   16
#define IPL_DEPTH_32F   32

#define IPL_DEPTH_8S  (IPL_DEPTH_SIGN| 8)
#define IPL_DEPTH_16S (IPL_DEPTH_SIGN|16)
#define IPL_DEPTH_32S (IPL_DEPTH_SIGN|32)


</pre>一、对图像的单一通道的读取,修改。<pre name="code" class="cpp">// opencv10.cpp : 定义控制台应用程序的入口点。
//把BGR三通道图像分解成单通道来显示
//

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"

int _tmain(int argc, _TCHAR* argv[])
{
	IplImage* img;
	img = cvLoadImage("D:\\PERSONAL\\VC++\\OpenCV\\image\\hy2.jpg");

	for(int y = 0; y<img->height; y++)            //char
	{<span style="white-space:pre">					</span>      //图像原点的起始地址    //一行的字节数 int
		unsigned char* prow = (unsigned char*)(img->imageData + y*img->widthStep); 
		for(int x = 0;x<img->width; x++)
		{//三通道 所以要乘以3
			prow[3*x + 0] = 0;  //利用指针访问img中的像素点的第【0】
			//prow[3*x + 1] = 0;<span style="font-family: Arial, Helvetica, sans-serif;">//利用指针访问img中的像素点的第【1】通道
</span>			//prow[3*x + 2] = 0;<span style="font-family: Arial, Helvetica, sans-serif;">//利用指针访问img中的像素点的第【2】通道</span>

		}
	}

	cvNamedWindow("hy2");
	cvShowImage("hy2",img);
	cvWaitKey(0);
	cvReleaseImage(&img);
	cvDestroyWindow("hy2");
	return 0;
}


二、分离通道显示

// opencv10.cpp : 定义控制台应用程序的入口点。
//把BGR三通道图像分解成单通道来显示
//

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"

int _tmain(int argc, _TCHAR* argv[])
{
	IplImage* img;
	IplImage* b_img;
	IplImage* g_img;
	IplImage* r_img;
	img = cvLoadImage("D:\\PERSONAL\\VC++\\OpenCV\\image\\hy2.jpg");

	b_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);//产生图像  1图像的大小  2图像深度   3图像通道数
	g_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
	r_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
	for(int 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(int x = 0;x<img->width; x++)
		{//三通道 所以要乘以3  //指针的移动
			brow[x] = prow[3*x + 0] ;  //注意单通道和三通道指针偏移的差别
			grow[x] = prow[3*x + 1] ;  // X 的含义:第 X 个像素点。左上为原点,右边->下一行左往右……
			rrow[x] = prow[3*x + 2] ;
		}
	}

	cvNamedWindow("hy2");
	cvShowImage("hy2",img);
	cvNamedWindow("hy2_b");
	cvShowImage("hy2_b",b_img);
	cvNamedWindow("hy2_g");
	cvShowImage("hy2_g",g_img);
	cvNamedWindow("hy2_r");
	cvShowImage("hy2_r",r_img);

	cvWaitKey(0);

	cvReleaseImage(&img);
	cvDestroyWindow("hy2");
	cvReleaseImage(&b_img);
	cvDestroyWindow("hy2_b");
	cvReleaseImage(&g_img);
	cvDestroyWindow("hy2_g");
	cvReleaseImage(&r_img);
	cvDestroyWindow("hy2_r");

	return 0;
}
单通道图像都是灰度级图像,grayscale 

双通道等测试程序

	for(int x = 0;x<img->width; x++)
		{//三通道 所以要乘以3  //指针的移动
			//prow[3*x + 0] = 255;//B
			prow[3*x + 1] = 255;//G
			//prow[3*x + 2] = 255;//R
		}
	}

三、感兴趣区 ROI

1.捕捉显示感兴趣区

int _tmain(int argc, _TCHAR* argv[])
{
	IplImage* img;
	img = cvLoadImage("D:\\PERSONAL\\VC++\\OpenCV\\image\\hy2.jpg");

	CvRect rect;//图像中的矩形区
	rect.x = 520; rect.y = 130;
	rect.width = 160; rect.height = 170;
	cvSetImageROI(img,rect);
	//cvResetImageROI();

	cvNamedWindow("hy2");
	cvShowImage("hy2",img);
	cvWaitKey(0);
	cvReleaseImage(&img);
	cvDestroyWindow("hy2");
	
	return 0;
}

2.简单应用

example1: 

// 代码有点问题

#include "stdafx.h"
#include "highgui.h"
#include "cv.h"

int _tmain(int argc, _TCHAR* argv[])
{
	IplImage* img;
	IplImage* head;
	img = cvLoadImage("D:\\PERSONAL\\VC++\\OpenCV\\image\\hy4.jpg");
	head = cvLoadImage("D:\\PERSONAL\\VC++\\OpenCV\\image\\hy2head.jpg");

	CvRect rect;//图像中的矩形区
	rect.x = 700; rect.y = 130;
	rect.width = head->width; 
	rect.height = head->height;
	cvSetImageROI(img,rect);
	//cvResetImageROI();
	for(unsigned int y = rect.y ; y<head->height; y++)
	{
		unsigned char* prow = (unsigned char*)(img->imageData + y*img->widthStep);
		unsigned char* headprow = (unsigned char*)(head->imageData + y*head->widthStep);
		for(unsigned int x = rect.x ; x<head->width +700 ; x++)
		{
			prow[3*x + 0] = headprow[3*(x-rect.x) + 0];
			prow[3*x + 1] = headprow[3*(x-rect.x) + 1];
			prow[3*x + 2] = headprow[3*(x-rect.x) + 2];
		}
	}

	cvResetImageROI(img);
	cvNamedWindow("hy2");
	cvShowImage("hy2",img);
	cvWaitKey(0);
	cvReleaseImage(&img);
	cvDestroyWindow("hy2");
	
	return 0;
}
//example2:
int _tmain(int argc, _TCHAR* argv[])
{
	IplImage* img;
	IplImage* head;
	img = cvLoadImage("D:\\PERSONAL\\VC++\\OpenCV\\image\\hy4.jpg");
	head = cvLoadImage("D:\\PERSONAL\\VC++\\OpenCV\\image\\hy2head.jpg");

	CvRect rect;//图像中的矩形区
	rect.x = 700; rect.y = 130;
	rect.width = head->width; 
	rect.height = head->height;
	cvSetImageROI(img,rect);
	//cvResetImageROI();
	/*
	for(unsigned int y = rect.y ; y<head->height; y++)
	{
		unsigned char* prow = (unsigned char*)(img->imageData + y*img->widthStep);
		unsigned char* headprow = (unsigned char*)(head->imageData + y*head->widthStep);
		for(unsigned int x = rect.x ; x<head->width +700 ; x++)
		{
			prow[3*x + 0] = headprow[3*(x-rect.x) + 0];
			prow[3*x + 1] = headprow[3*(x-rect.x) + 1];
			prow[3*x + 2] = headprow[3*(x-rect.x) + 2];
		}
	}
*/

	for(int y = 0 ; y<head->height; y++)
	{
		unsigned char* prow = (unsigned char*)(img->imageData + (y + rect.y)*img->widthStep);
		unsigned char* headprow = (unsigned char*)(head->imageData + y*head->widthStep);
		for(int x = 0; x<head->width; x++)
		{
			prow[3*(x+rect.x) + 0] = headprow[3*x + 0];
			prow[3*(x+rect.x) + 1] = headprow[3*x + 1];
			prow[3*(x+rect.x) + 2] = headprow[3*x + 2];
		}
	}

	cvResetImageROI(img);
	cvNamedWindow("hy2");
	cvShowImage("hy2",img);
	cvWaitKey(0);
	cvReleaseImage(&img);
	cvDestroyWindow("hy2");
	
	return 0;
}










你可能感兴趣的:(opencv学习笔记之三 IplImage结构体)