您的位置:首页 > 运维架构

opencv学习笔记之三 IplImage结构体

2014-12-17 10:45 351 查看
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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: