图像显示的origin属性改变 (原点的改变)
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[]){
IplImage* img;
img=cvLoadImage("d://1.jpg");
//原点显示 默认值 0:左上角是原点 1:左下角是原点
img->origin=1;
//输出图像通道数 3通道图像RGB模式
printf("nChannels is %d",img->nChannels);
cvNamedWindow("1");
cvShowImage("1",img);
cvWaitKey(0);
return 0;
}
三个颜色通道分割显示:
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
IplImage* img , *sub_img;
int y,x;
//加载图像1.jpg
img = cvLoadImage("d:\\1.jpg");
/* 将3通道图像 分解成 3幅单通道的图像 */
//声明三个图像变量
IplImage* b_img ,*g_img,*r_img;
//给三个单通图像 分配内存空间
b_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U , 1 );
g_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U , 1 );
r_img = cvCreateImage(cvGetSize(img),IPL_DEPTH_8U , 1 );
for(y=0;y<img->height;y++)
{
//将图像指针偏移到第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++)
{
//将B通道 G通道 R通道的值 分别拷贝到3个单通道的图像中去
brow[x] = prow[3*x + 0] ; //拷贝B通道的值prow[3*x + 0] 到 单通道图像b_img
grow[x] = prow[3*x + 1] ; //拷贝G通道的值prow[3*x + 0] 到 单通道图像b_img
rrow[x] = prow[3*x + 2] ; //拷贝R通道的值prow[3*x + 0] 到 单通道图像b_img
}
}
//创建3个窗口
cvNamedWindow("b");
cvNamedWindow("g");
cvNamedWindow("r");
//显示b g r三个通道的图像
cvShowImage("b" , b_img);
cvShowImage("g" , g_img);
cvShowImage("r" , r_img);
//显示大图像
cvNamedWindow("1");
cvShowImage("1",img);
//等待按键
cvWaitKey(0);
//释放内存空间
cvReleaseImage(&img);
return 0;
}
++
人脸覆盖简单技术:
#include <opencv\cv.h>
#include <opencv\highgui.h>
#include <opencv\cxcore.h>
#include <stdlib.h>
#include <stdio.h>
int main(int argc, char* argv[])
{
IplImage* img , *sub_img;
int y,x;
//加载图像1.jpg
img = cvLoadImage("C:\\Users\\zxl\\Desktop\\1.jpg");
//加载图像4.jpg
sub_img = cvLoadImage("C:\\Users\\zxl\\Desktop\\4.jpg");
//设置一个感兴趣区域
CvRect rect;
rect.x = 457;
rect.y = 200 ;
rect.width = sub_img->width;
rect.height = sub_img->height;
///方法1
///
将小图像 拷贝 到大图像的 roi区域
//for( y=0;y<sub_img->height;y++)
//{
// //将指针偏移到第Y行
// unsigned char* subImgData = (unsigned char*)(sub_img->imageData + y*sub_img->widthStep);
// //将目标大图像指针偏移到第 (rect.y = 200)+1行上(进行覆盖)
// unsigned char* bigImgData = (unsigned char*)(img->imageData + (y+rect.y)*img->widthStep);
//
// for( x=0;x<sub_img->width;x++)
// {
// //偏移到第x个像素
// //B通道
// bigImgData[3*(x+rect.x) + 0 ] = subImgData[3*x + 0 ];
// //G通道
// bigImgData[3*(x+rect.x) + 1 ] = subImgData[3*x + 1 ];
// //R通道
// bigImgData[3*(x+rect.x) + 2 ] = subImgData[3*x + 2 ];
// }
//}
///
//使用opencv中的函数 设置roi区域
cvSetImageROI(img , rect);
///方法2
///
cvCopy(sub_img,img);
///
//使用完 ROI区域后 要调用函数释放roi区域
cvResetImageROI(img);
//显示大图像
cvNamedWindow("1");
cvShowImage("1",img);
//等待按键
cvWaitKey(0);
//释放内存空间
/*cvReleaseImage(&img);
cvReleaseImage(&sub_img);*/
return 0;
}
效果:
同上效果代码:
#include <opencv/cv.h>
#include <opencv/highgui.h>
int main()
{
IplImage* img = cvLoadImage("d:\\1.jpg",0);
CvRect roi =cvRect(6, 6, 300, 300);
cvNamedWindow("img");
cvShowImage("img", img);
IplImage* img1 = cvLoadImage("d:\\lena.jpg",0);
CvRect roi1 = cvRect(6, 6, 300, 300);
cvNamedWindow("img1");
cvShowImage("img1", img1);
cvSetImageROI(img, roi);
cvSetImageROI(img1, roi1);
cvCopy(img1, img);
cvResetImageROI(img);
cvResetImageROI(img1);
cvNamedWindow("result");
cvShowImage("result", img);
cvWaitKey(-1);
cvReleaseImage(&img);
cvReleaseImage(&img1);
cvDestroyAllWindows();
return 0;
}