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 } }
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; }
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; }