《opencv3程式設計入門》程式碼(配合網盤視訊,C語言)
阿新 • • 發佈:2019-01-31
1.5.2【影象腐蝕】
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
//#include<opencv2/opencv.hpp>
using namespace cv;//cvmingmingkongjian
int main()
{
Mat srcImage=imread("1.jpg");
imshow("{original]",srcImage);
Mat element=getStructuringElement(MORPH_RECT,Size(15,15));
Mat dstImage;
erode(srcImage,dstImage,element);
imshow("[errosion]",dstImage);
waitKey(0);
return 0;
} 【影象模糊】 #include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp" using namespace cv;
int main()
{
Mat srcImage=imread("1.jpg");//zairu
imshow("[junzhilvbo-original]",srcImage);//xianshiyuantu
Mat dstImage;
blur(srcImage,dstImage,Size(7,7)); imshow("[blur]",dstImage); waitKey(0);
} 【canny邊緣檢測】 #include"opencv2/opencv.hpp"
#include"opencv2/imgproc/imgproc.hpp"
using namespace cv;
int main()
{
Mat srcImage=imread("1.jpg");//zairu
imshow("[original-canny]",srcImage);//xianshiyuantu
Mat edge,grayImage;
cvtColor(srcImage,grayImage,CV_BGR2GRAY);
blur(grayImage,edge,Size(3,3));
imshow("[gray]",grayImage); Canny(edge,edge,3,9,3);
imshow("[Canny]",edge); waitKey(0);
return 0;
} 【1.6.1】讀取並播放視訊 #include <opencv2/opencv.hpp>
using namespace cv; int main()
{
VideoCapture capture("1.avi"); while(1)
{
Mat frame;
capture>>frame;
if (frame.empty())
{
break;
} imshow("duqushipin",frame);
waitKey(3);
}
return 0;
}
【書上攝像頭】
#include <highgui.h> int main(int argc,char*argv[]) {
cvNamedWindow("avi");
CvCapture* capture=cvCreateCameraCapture(-1);//-1 代表隨機選取攝像頭
IplImage* frame;
while(1)
{
frame=cvQueryFrame(capture);
if(!frame)
{
break;
}
cvShowImage("avi",frame);
char c=cvWaitKey(33);//控制幀率
if(c==27)
{
break;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("avi");//釋放視窗 return 0;
}
【視訊教程中的開啟視訊】
#include <highgui.h> int main(int argc,char*argv[]) {
cvNamedWindow("avi");
CvCapture* capture=cvCreateFileCapture("D:\\opencvtest-demo\\1.avi");
IplImage* frame;
while(1)
{
frame=cvQueryFrame(capture);
if(!frame)
{
break;
}
cvShowImage("avi",frame);
char c=cvWaitKey(33);//控制幀率
if(c==27)
{
break;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("avi");//釋放視窗 return 0;
}
【建立滾動條+指標位置】
#include "cv.h"
#include "highgui.h"
int g_slider_pos=0;
void on_changed(int pos)
{
printf("g_slider_pos is %d\n",g_slider_pos);
} int main(int argc,char*argv[])
{ cvNamedWindow("show");
cvCreateTrackbar(
"position",
"show",
&g_slider_pos,
400,
on_changed );
cvShowImage("show",NULL);
cvWaitKey(0);
return 0;
} 【從滾動條開始播放】
【讓滾動條隨著視訊移動】
//#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include <opencv2\opencv.hpp>
using namespace cv;
IplImage* frame;
int c;
int g_slider_pos=0;
CvCapture*g_capture=NULL;
int frame_count=0;
void onTrackbarSlider(int pos)
{
cvSetCaptureProperty(
g_capture,
CV_CAP_PROP_POS_FRAMES,
pos
);
frame_count=pos;
} int main(int argc,char*argv[])
{ cvNamedWindow("show");
g_capture=cvCreateFileCapture("D:\\opencvtest-demo\\1.avi");
int frames=(int)cvGetCaptureProperty(
g_capture,
CV_CAP_PROP_FRAME_COUNT
);
if(frame>0);
{
cvCreateTrackbar(
"position",
"show",
&g_slider_pos,
frames,
onTrackbarSlider
);
while(1)
{
frame=cvQueryFrame(g_capture);
if(!frame)
{
break;
}
cvShowImage("show",frame);
char c=cvWaitKey(33);
if(c==27)
{
break;
}
}
cvSetTrackbarPos("Position","show",frame_count);
frame_count++;
}
cvShowImage("show",NULL);
cvWaitKey(0);
return 0;
}
【寫視訊檔案】 cvSize size= cvSize(480,360);
double fps=15;
CvVideoWriter = cvCreateVideoWriter("");
int image_id=0;
char filename[256];
sprintf(filename,"");
IplImage* src=cvLoadImage(filename);
if(!src)
{
return 0;
}
IplImage*src_resize=cvCreateImage(size,8,3);
cvNamedWindow("avi");
while(src)
{
cvShowImage("avi",src_resizze);
cvWaitKey(1);
cvResize(src,src_resize);
cvWriteFrame(writer,src_resize);
cvReaseImage(&src); image_id++;
printf(filename,"");
src=cvLoadImage(filename);
}
cvReaseVideoWriter(&writer);
cvReleaseImage(&src_resize);
return 0;
} 【顯示影象】
#include"stdafx.h"
#include"cv.h"
#include"cxcore.h"
#include"highgui.h" int main(int argc,char*argv[])
{
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\1.jpg",CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR);
cvNamedWindow("showImage");
cvShowImage("showImage",src);
cvWaitKey(0); cvReleaseImage(&src);
cvDestroyWindow("showImage");
return 0; } 【寫視訊檔案】
#include"stdafx.h"
#include"cv.h"
#include"highgui.h"
#include"cxcore.h"
#include <stdlib.h>
#include <stdio.h> int main(int argc,char*argv[]) {
CvSize size=cvSize(600,400);
double fps=15;
CvVideoWriter*writer=cvCreateVideoWriter("D:\\opencvtest-demo\\out.avi",CV_FOURCC('X','V','I','D'),fps,size);
int image_id=1;
char filename[256];
sprintf(filename,"D:\\opencvtest-demo\\火柴\\%d.jpg",image_id);
IplImage*src=cvLoadImage(filename);//先載入進來一幀,判斷是否載入成功 if(!src)
{
return 0;
}
IplImage*src_resize=cvCreateImage(size,8,3);
cvNamedWindow("avi"); while(src)
{
cvShowImage("avi",src_resize);
cvWaitKey(50); cvResize(src,src_resize);
cvWriteFrame(writer,src_resize); cvReleaseImage(&src);//之前影象釋放 image_id++;
sprintf(filename,"D:\\opencvtest-demo\\火柴\\%d.jpg",image_id);
src=cvLoadImage(filename);
}
cvReleaseVideoWriter(&writer);
cvReleaseImage(&src_resize);
return 0;
} 【矩陣通道與維度】
#include"stdafx.h"
#include <stdio.h>
//#include"cxtypes.h"
#include"highgui.h"
#include"cxcore.h"
#include"cv.h" int main(int argc,char*argv[]) {
float data[18]=
{
30,40,60,50,40,44,
67,88,55,33,22,97,
59,69,32,46,25,45,
};
CvMat mat;
cvInitMatHeader(&mat,3,1,CV_32FC3,data);//根據通道數,mat後面3,6變3,3;本例講的從1-3通道,換系數
int nChannels=3;; mat.data.ptr;
int y,x;
for(y=0;y<mat.rows;y++)
{
float*p_float=(float*)(mat.data.ptr+y*mat.step);//偏移地址是一行的位元組數,訪問第幾行,用y乘以幾;通道數變化不改變y偏移方法 for(x=0;x<mat.cols;x++)
{ float value[3];
value[0]=*(p_float+x*nChannels);
value[1]=*(p_float+x*nChannels+1);
value[2]=*(p_float+x*nChannels+2);
printf("(%f %f %f)",value[0],value[1],value[2]); }
} return 0; }
【第十集 結構體詳解 BGR通道分別顯示】
#include <stdio.h>
#include"highgui.h" int main(int argc,char*argv[]) {
IplImage* img=cvLoadImage("D:\\opencvtest-demo\\1.jpg");
IplImage* sub_img=cvLoadImage("D:\\opencvtest-demo\\2.jpg");
CvRect rect;
rect.x=107;
rect.y=13;
rect.width=sub_img->width;
rect.height=sub_img->height; cvSetImageROI(img,rect); cvCopy(sub_img,img);//也可以自己用雙重迴圈實現
cvResetImageROI(img);//取消ROI區域
/*IplImage* r_img,*b_img,*g_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);//一個通道所以寫1 int y,x;//訪問影象矩陣
for(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(x=0;x<img->width;x++)
{
prow[1*x+0]=0;
prow[1*x+1]=255;
prow[1*x+2]=0;
//第y行地x畫素的B通道
//prow[3*x+1]=255;//第y行地x畫素的G通道
//prow[3*x+2]=//第y行地x畫素的R通道
brow[x]=prow[3*x+0];//三通道對單通道的賦值
grow[x]=prow[3*x+1];
rrow[x]=prow[3*x+2];
}
}
cvNamedWindow("b");
cvNamedWindow("g");
cvNamedWindow("r");
cvShowImage("b",r_img);
cvShowImage("g",g_img);
cvShowImage("r",b_img); //img->origin=1;
//img->depth
//printf("nChannels is %d\n",img->nChannels);//列印影象的通道 */
cvNamedWindow("1");
cvShowImage("1",img);
cvWaitKey(0);
return 0;
} 【第11集 灰度直方圖 】
#include"stdafx.h"
#include"cv.h"
#include"cxcore.h"
#include"highgui.h" int main(int argc,char*argv[]) {
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\4.jpg",CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR);
cvNamedWindow("showImage");
cvShowImage("showImage",src);
cvWaitKey(0);
int dims=1;
int size=256; float range[]={0,255};
float* ranges[]={range}; cvCreateHist(dims,&size,CV_HIST_ARRAY,ranges,1);
cvClearHist(hist); IplImage* imgRed=cvCreateImage(cvGetSize(src),8,1);//3通道
IplImage* imgGreen=cvCreateImage(cvGetSize(src),8,1);
IplImage* imgBlue=cvCreateImage(cvGetSize(src),8,1); cvSplit(src,imgBlue,imgGreen,imgRed,NULL);//分解成4個通道
cvCalcHist(&imgBlue,hist,0,0);
//..
cvClearHist(hist); cvCalcHist(&imgGreen,hist,0,0);
//..
cvClearHist(hist); cvCalcHist(&imgRed,hist,0,0);
//..
cvClearHist(hist); IplImage* DrawHistogram(CvHistogram* hist,float )
{
float hisMax=0;
cvGetMinMaxHistValue(hist,0,&histMax,0,0);//計算直方圖最大值
IplImage* imgHist=cvCreateImage(cvSize(256*))
cvZero(imgHist);//因為隨機值,先置0
for(int i=0;i<255;i++)
{
float histValue+cvQueryHistValue_1D(hist,i);//獲取當前bin的值
float histValue+cvQueryHistValue_1D(hist,i+1);//獲取下一個bin的值
} } return 0;
}
【轉換成灰度影象並存儲】
#include "highgui.h"
#include <cv.h>
#include <cvaux.h>
int main(int argc, char* argv[])
{
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\1.jpg"); if( !src->imageData ) // 檢查是否正確載入影象
return -1;
cvNamedWindow("image" ); //建立視窗
cvShowImage("image", src); //顯示影象
IplImage* gray_image = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//建立目標影象
cvCvtColor(src,gray_image,CV_BGR2GRAY);//cvCvtColor(src,des,CV_BGR2GRAY),從RGB到灰度影象
cvNamedWindow("gray_image");//建立顯示目標的視窗
cvShowImage("gray_image",gray_image);//顯示灰度影象
cvWaitKey(0);
cvSaveImage("D:\\opencvtest-demo\\gray_image.jpg",gray_image); //儲存影象 cvReleaseImage(&src); //釋放空間
cvReleaseImage(&gray_image);
cvDestroyAllWindows();
return 0;
}
【11集 灰度直方圖】【未能實現】
#include"stdafx.h"
#include"cv.h"
#include"cxcore.h"
#include"highgui.h"
#include<stdio.h>
/*#define MAX_ASCII (127)
int* DrawHistogram(int *Count); */ int main(int argc,char*argv[]) {
//float scaleX=1, float scaleY=1;
CvHistogram* hist;
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\4.jpg",CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR);
cvNamedWindow("showImage");
cvShowImage("showImage",src);
cvWaitKey(0);
IplImage* DrawHistogram(CvHistogram* hist,float scaleX=1, float scaleY=1);
{
float scaleX=1, float scaleY=1;
float histMax=0;
cvGetMinMaxHistValue(hist,0,&histMax,0);//計算直方圖最大值 IplImage* imgHist=cvCreateImage(cvSize(256*scaleX,64*scaleY),8,1);//改變引數來改變顯示影象的大小
cvZero(imgHist);//因為隨機值,先置0
for(int i=0;i<255;i++)
{
float histValue=cvQueryHistValue_1D(hist,i);//獲取當前bin的值
float nextValue=cvQueryHistValue_1D(hist,i+1);//獲取下一個bin的值 CvPoint pt1=cvPoint( i*scaleX,64*scaleY);
CvPoint pt2=cvPoint((i+1)*scaleX,64*scaleY);
CvPoint pt3=cvPoint((i+1)*scaleX,64*scaleY-(nextValue/histMax)*64*scaleY);
CvPoint pt4=cvPoint( i*scaleX,(64-(nextValue/histMax)*64) *scaleY);
int numPts=5;
CvPoint pts[5];
pts[0]=pt1;
pts[1]=pt2;
pts[2]=pt3;
pts[3]=pt4;
pts[4]=pt1;
cvFillConvexPoly(imgHist,pts,numPts,cvScalar(255));
}
}
int dims=1;
int size=256; float range[]={0,255};
float* ranges[]={range}; hist=cvCreateHist(dims,&size,CV_HIST_ARRAY,ranges,1);
cvClearHist(hist); IplImage* imgRed=cvCreateImage(cvGetSize(src),8,1);//3通道
IplImage* imgGreen=cvCreateImage(cvGetSize(src),8,1);
IplImage* imgBlue=cvCreateImage(cvGetSize(src),8,1); cvSplit(src,imgBlue,imgGreen,imgRed,NULL);//分解成4個通道 cvCalcHist(&imgBlue,hist,0,0);
IplImage* histBlue= DrawHistogram(hist);
cvClearHist(hist); cvCalcHist(&imgGreen,hist,0,0);
IplImage* histGreen= DrawHistogram(hist);
cvClearHist(hist); cvCalcHist(&imgRed,hist,0,0);
IplImage* histRed= DrawHistogram(hist);
cvClearHist(hist); cvNamedWindow("B");
cvNamedWindow("G");
cvNamedWindow("R"); cvShowImage("B",histBlue);
cvShowImage("G",histGreen);
cvShowImage("R",histRed);
cvWaitKey(0); return 0;
} 【12 RGB顏色空間】【未能實現】
//#include"stdafx.h"
//#include"cv.h"
#include"cxcore.h"
#include"highgui.h" int main(int argc,char*argv[])
{
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\1.jpg");
IplImage* dst=cvCreateImage(cvGetSize(src),8,3);
cvMerge(src,src,src,0,dst); cvNamedWindow("src");
cvShowImage("src",src);
//cvWaitKey(0);
cvNamedWindow("dst");
cvShowImage("dst",dst);
//cvWaitKey(0); /*cvReleaseImage(&src);
cvDestroyWindow("src");
cvReleaseImage(&dst);
cvDestroyWindow("dst");*/
return 0; } 【14 顏色空間轉換】 #include "stdafx.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
int main(int argc,char*argv[])
{
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\1.jgp");
cvNamedWindow("src");
cvShowImage("src",hrc); /*
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\1.jpg");
IplImage* img_hsv=cvCreateImage(cvGetSize(src),8,3);//char型,8位
IplImage* img_h=cvCreateImage(cvGetSize(src),8,1);
IplImage* img_s=cvCreateImage(cvGetSize(src),8,1);
IplImage* img_v=cvCreateImage(cvGetSize(src),8,1);
*/ IplImage*src_float=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,3);//char型轉換成float
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\1.jpg");
IplImage* img_hsv=cvCreateImage(cvGetSize(src),8,3);//char型,8位
IplImage* img_h=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1);
IplImage* img_s=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1);
IplImage* img_v=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1); cvConvertScale(src,src_float,1.0,0);//最後那個0是偏移量
cvSplit(img_hsv,img_h,img_s,img_v,NULL);
IplImage* hsv=cvCreateImage(cvGetSize(src),8,3);//char型,8位
IplImage* h=cvCreateImage(cvGetSize(src),8,1);
IplImage* s=cvCreateImage(cvGetSize(src),8,1);
IplImage* v=cvCreateImage(cvGetSize(src),8,1); cvConvertScale(img_h,h,(1.0/360.0)*255.0,0);
cvConvertScale(img_s,s,255.0,0);
cvConvertScale(img_v,v,1.0,0); cvMerge(h,s,v,NULL,hsv);//合成
/*
cvConvertScale(img_h,h,(1.0));
cvCvtColor(src,img_hsv,CV_BGR2HSV);
cvSplit(img_hsv,img_h,img_s,img_v,NULL);
*/
cvNamedWindow("hsv");
cvShowImage("hsv",hsv);
for(int y=0;y<img_h->height;y++)
{ for(int x=0;x<img_h->width;x++)
{ float value=cvGetReal2D(img_h,y,x);
printf("%f",value);
}
//printf("\n");
}
}
#include<opencv2/imgproc/imgproc.hpp>
//#include<opencv2/opencv.hpp>
using namespace cv;//cvmingmingkongjian
int main()
{
Mat srcImage=imread("1.jpg");
imshow("{original]",srcImage);
Mat element=getStructuringElement(MORPH_RECT,Size(15,15));
Mat dstImage;
erode(srcImage,dstImage,element);
imshow("[errosion]",dstImage);
waitKey(0);
return 0;
} 【影象模糊】 #include"opencv2/highgui/highgui.hpp"
#include"opencv2/imgproc/imgproc.hpp" using namespace cv;
int main()
{
Mat srcImage=imread("1.jpg");//zairu
imshow("[junzhilvbo-original]",srcImage);//xianshiyuantu
Mat dstImage;
blur(srcImage,dstImage,Size(7,7)); imshow("[blur]",dstImage); waitKey(0);
} 【canny邊緣檢測】 #include"opencv2/opencv.hpp"
#include"opencv2/imgproc/imgproc.hpp"
using namespace cv;
int main()
{
Mat srcImage=imread("1.jpg");//zairu
imshow("[original-canny]",srcImage);//xianshiyuantu
Mat edge,grayImage;
cvtColor(srcImage,grayImage,CV_BGR2GRAY);
blur(grayImage,edge,Size(3,3));
imshow("[gray]",grayImage); Canny(edge,edge,3,9,3);
imshow("[Canny]",edge); waitKey(0);
return 0;
} 【1.6.1】讀取並播放視訊 #include <opencv2/opencv.hpp>
using namespace cv; int main()
{
VideoCapture capture("1.avi"); while(1)
{
Mat frame;
capture>>frame;
if (frame.empty())
{
break;
} imshow("duqushipin",frame);
waitKey(3);
}
return 0;
}
【書上攝像頭】
#include <highgui.h> int main(int argc,char*argv[]) {
cvNamedWindow("avi");
CvCapture* capture=cvCreateCameraCapture(-1);//-1 代表隨機選取攝像頭
IplImage* frame;
while(1)
{
frame=cvQueryFrame(capture);
if(!frame)
{
break;
}
cvShowImage("avi",frame);
char c=cvWaitKey(33);//控制幀率
if(c==27)
{
break;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("avi");//釋放視窗 return 0;
}
【視訊教程中的開啟視訊】
#include <highgui.h> int main(int argc,char*argv[]) {
cvNamedWindow("avi");
CvCapture* capture=cvCreateFileCapture("D:\\opencvtest-demo\\1.avi");
IplImage* frame;
while(1)
{
frame=cvQueryFrame(capture);
if(!frame)
{
break;
}
cvShowImage("avi",frame);
char c=cvWaitKey(33);//控制幀率
if(c==27)
{
break;
}
}
cvReleaseCapture(&capture);
cvDestroyWindow("avi");//釋放視窗 return 0;
}
【建立滾動條+指標位置】
#include "cv.h"
#include "highgui.h"
int g_slider_pos=0;
void on_changed(int pos)
{
printf("g_slider_pos is %d\n",g_slider_pos);
} int main(int argc,char*argv[])
{ cvNamedWindow("show");
cvCreateTrackbar(
"position",
"show",
&g_slider_pos,
400,
on_changed );
cvShowImage("show",NULL);
cvWaitKey(0);
return 0;
} 【從滾動條開始播放】
【讓滾動條隨著視訊移動】
//#include "stdafx.h"
#include "cv.h"
#include "highgui.h"
#include <opencv2\opencv.hpp>
using namespace cv;
IplImage* frame;
int c;
int g_slider_pos=0;
CvCapture*g_capture=NULL;
int frame_count=0;
void onTrackbarSlider(int pos)
{
cvSetCaptureProperty(
g_capture,
CV_CAP_PROP_POS_FRAMES,
pos
);
frame_count=pos;
} int main(int argc,char*argv[])
{ cvNamedWindow("show");
g_capture=cvCreateFileCapture("D:\\opencvtest-demo\\1.avi");
int frames=(int)cvGetCaptureProperty(
g_capture,
CV_CAP_PROP_FRAME_COUNT
);
if(frame>0);
{
cvCreateTrackbar(
"position",
"show",
&g_slider_pos,
frames,
onTrackbarSlider
);
while(1)
{
frame=cvQueryFrame(g_capture);
if(!frame)
{
break;
}
cvShowImage("show",frame);
char c=cvWaitKey(33);
if(c==27)
{
break;
}
}
cvSetTrackbarPos("Position","show",frame_count);
frame_count++;
}
cvShowImage("show",NULL);
cvWaitKey(0);
return 0;
}
【寫視訊檔案】 cvSize size= cvSize(480,360);
double fps=15;
CvVideoWriter = cvCreateVideoWriter("");
int image_id=0;
char filename[256];
sprintf(filename,"");
IplImage* src=cvLoadImage(filename);
if(!src)
{
return 0;
}
IplImage*src_resize=cvCreateImage(size,8,3);
cvNamedWindow("avi");
while(src)
{
cvShowImage("avi",src_resizze);
cvWaitKey(1);
cvResize(src,src_resize);
cvWriteFrame(writer,src_resize);
cvReaseImage(&src); image_id++;
printf(filename,"");
src=cvLoadImage(filename);
}
cvReaseVideoWriter(&writer);
cvReleaseImage(&src_resize);
return 0;
} 【顯示影象】
#include"stdafx.h"
#include"cv.h"
#include"cxcore.h"
#include"highgui.h" int main(int argc,char*argv[])
{
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\1.jpg",CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR);
cvNamedWindow("showImage");
cvShowImage("showImage",src);
cvWaitKey(0); cvReleaseImage(&src);
cvDestroyWindow("showImage");
return 0; } 【寫視訊檔案】
#include"stdafx.h"
#include"cv.h"
#include"highgui.h"
#include"cxcore.h"
#include <stdlib.h>
#include <stdio.h> int main(int argc,char*argv[]) {
CvSize size=cvSize(600,400);
double fps=15;
CvVideoWriter*writer=cvCreateVideoWriter("D:\\opencvtest-demo\\out.avi",CV_FOURCC('X','V','I','D'),fps,size);
int image_id=1;
char filename[256];
sprintf(filename,"D:\\opencvtest-demo\\火柴\\%d.jpg",image_id);
IplImage*src=cvLoadImage(filename);//先載入進來一幀,判斷是否載入成功 if(!src)
{
return 0;
}
IplImage*src_resize=cvCreateImage(size,8,3);
cvNamedWindow("avi"); while(src)
{
cvShowImage("avi",src_resize);
cvWaitKey(50); cvResize(src,src_resize);
cvWriteFrame(writer,src_resize); cvReleaseImage(&src);//之前影象釋放 image_id++;
sprintf(filename,"D:\\opencvtest-demo\\火柴\\%d.jpg",image_id);
src=cvLoadImage(filename);
}
cvReleaseVideoWriter(&writer);
cvReleaseImage(&src_resize);
return 0;
} 【矩陣通道與維度】
#include"stdafx.h"
#include <stdio.h>
//#include"cxtypes.h"
#include"highgui.h"
#include"cxcore.h"
#include"cv.h" int main(int argc,char*argv[]) {
float data[18]=
{
30,40,60,50,40,44,
67,88,55,33,22,97,
59,69,32,46,25,45,
};
CvMat mat;
cvInitMatHeader(&mat,3,1,CV_32FC3,data);//根據通道數,mat後面3,6變3,3;本例講的從1-3通道,換系數
int nChannels=3;; mat.data.ptr;
int y,x;
for(y=0;y<mat.rows;y++)
{
float*p_float=(float*)(mat.data.ptr+y*mat.step);//偏移地址是一行的位元組數,訪問第幾行,用y乘以幾;通道數變化不改變y偏移方法 for(x=0;x<mat.cols;x++)
{ float value[3];
value[0]=*(p_float+x*nChannels);
value[1]=*(p_float+x*nChannels+1);
value[2]=*(p_float+x*nChannels+2);
printf("(%f %f %f)",value[0],value[1],value[2]); }
} return 0; }
【第十集 結構體詳解 BGR通道分別顯示】
#include <stdio.h>
#include"highgui.h" int main(int argc,char*argv[]) {
IplImage* img=cvLoadImage("D:\\opencvtest-demo\\1.jpg");
IplImage* sub_img=cvLoadImage("D:\\opencvtest-demo\\2.jpg");
CvRect rect;
rect.x=107;
rect.y=13;
rect.width=sub_img->width;
rect.height=sub_img->height; cvSetImageROI(img,rect); cvCopy(sub_img,img);//也可以自己用雙重迴圈實現
cvResetImageROI(img);//取消ROI區域
/*IplImage* r_img,*b_img,*g_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);//一個通道所以寫1 int y,x;//訪問影象矩陣
for(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(x=0;x<img->width;x++)
{
prow[1*x+0]=0;
prow[1*x+1]=255;
prow[1*x+2]=0;
//第y行地x畫素的B通道
//prow[3*x+1]=255;//第y行地x畫素的G通道
//prow[3*x+2]=//第y行地x畫素的R通道
brow[x]=prow[3*x+0];//三通道對單通道的賦值
grow[x]=prow[3*x+1];
rrow[x]=prow[3*x+2];
}
}
cvNamedWindow("b");
cvNamedWindow("g");
cvNamedWindow("r");
cvShowImage("b",r_img);
cvShowImage("g",g_img);
cvShowImage("r",b_img); //img->origin=1;
//img->depth
//printf("nChannels is %d\n",img->nChannels);//列印影象的通道 */
cvNamedWindow("1");
cvShowImage("1",img);
cvWaitKey(0);
return 0;
} 【第11集 灰度直方圖 】
#include"stdafx.h"
#include"cv.h"
#include"cxcore.h"
#include"highgui.h" int main(int argc,char*argv[]) {
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\4.jpg",CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR);
cvNamedWindow("showImage");
cvShowImage("showImage",src);
cvWaitKey(0);
int dims=1;
int size=256; float range[]={0,255};
float* ranges[]={range}; cvCreateHist(dims,&size,CV_HIST_ARRAY,ranges,1);
cvClearHist(hist); IplImage* imgRed=cvCreateImage(cvGetSize(src),8,1);//3通道
IplImage* imgGreen=cvCreateImage(cvGetSize(src),8,1);
IplImage* imgBlue=cvCreateImage(cvGetSize(src),8,1); cvSplit(src,imgBlue,imgGreen,imgRed,NULL);//分解成4個通道
cvCalcHist(&imgBlue,hist,0,0);
//..
cvClearHist(hist); cvCalcHist(&imgGreen,hist,0,0);
//..
cvClearHist(hist); cvCalcHist(&imgRed,hist,0,0);
//..
cvClearHist(hist); IplImage* DrawHistogram(CvHistogram* hist,float )
{
float hisMax=0;
cvGetMinMaxHistValue(hist,0,&histMax,0,0);//計算直方圖最大值
IplImage* imgHist=cvCreateImage(cvSize(256*))
cvZero(imgHist);//因為隨機值,先置0
for(int i=0;i<255;i++)
{
float histValue+cvQueryHistValue_1D(hist,i);//獲取當前bin的值
float histValue+cvQueryHistValue_1D(hist,i+1);//獲取下一個bin的值
} } return 0;
}
【轉換成灰度影象並存儲】
#include "highgui.h"
#include <cv.h>
#include <cvaux.h>
int main(int argc, char* argv[])
{
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\1.jpg"); if( !src->imageData ) // 檢查是否正確載入影象
return -1;
cvNamedWindow("image" ); //建立視窗
cvShowImage("image", src); //顯示影象
IplImage* gray_image = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1);//建立目標影象
cvCvtColor(src,gray_image,CV_BGR2GRAY);//cvCvtColor(src,des,CV_BGR2GRAY),從RGB到灰度影象
cvNamedWindow("gray_image");//建立顯示目標的視窗
cvShowImage("gray_image",gray_image);//顯示灰度影象
cvWaitKey(0);
cvSaveImage("D:\\opencvtest-demo\\gray_image.jpg",gray_image); //儲存影象 cvReleaseImage(&src); //釋放空間
cvReleaseImage(&gray_image);
cvDestroyAllWindows();
return 0;
}
【11集 灰度直方圖】【未能實現】
#include"stdafx.h"
#include"cv.h"
#include"cxcore.h"
#include"highgui.h"
#include<stdio.h>
/*#define MAX_ASCII (127)
int* DrawHistogram(int *Count); */ int main(int argc,char*argv[]) {
//float scaleX=1, float scaleY=1;
CvHistogram* hist;
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\4.jpg",CV_LOAD_IMAGE_ANYDEPTH|CV_LOAD_IMAGE_ANYCOLOR);
cvNamedWindow("showImage");
cvShowImage("showImage",src);
cvWaitKey(0);
IplImage* DrawHistogram(CvHistogram* hist,float scaleX=1, float scaleY=1);
{
float scaleX=1, float scaleY=1;
float histMax=0;
cvGetMinMaxHistValue(hist,0,&histMax,0);//計算直方圖最大值 IplImage* imgHist=cvCreateImage(cvSize(256*scaleX,64*scaleY),8,1);//改變引數來改變顯示影象的大小
cvZero(imgHist);//因為隨機值,先置0
for(int i=0;i<255;i++)
{
float histValue=cvQueryHistValue_1D(hist,i);//獲取當前bin的值
float nextValue=cvQueryHistValue_1D(hist,i+1);//獲取下一個bin的值 CvPoint pt1=cvPoint( i*scaleX,64*scaleY);
CvPoint pt2=cvPoint((i+1)*scaleX,64*scaleY);
CvPoint pt3=cvPoint((i+1)*scaleX,64*scaleY-(nextValue/histMax)*64*scaleY);
CvPoint pt4=cvPoint( i*scaleX,(64-(nextValue/histMax)*64) *scaleY);
int numPts=5;
CvPoint pts[5];
pts[0]=pt1;
pts[1]=pt2;
pts[2]=pt3;
pts[3]=pt4;
pts[4]=pt1;
cvFillConvexPoly(imgHist,pts,numPts,cvScalar(255));
}
}
int dims=1;
int size=256; float range[]={0,255};
float* ranges[]={range}; hist=cvCreateHist(dims,&size,CV_HIST_ARRAY,ranges,1);
cvClearHist(hist); IplImage* imgRed=cvCreateImage(cvGetSize(src),8,1);//3通道
IplImage* imgGreen=cvCreateImage(cvGetSize(src),8,1);
IplImage* imgBlue=cvCreateImage(cvGetSize(src),8,1); cvSplit(src,imgBlue,imgGreen,imgRed,NULL);//分解成4個通道 cvCalcHist(&imgBlue,hist,0,0);
IplImage* histBlue= DrawHistogram(hist);
cvClearHist(hist); cvCalcHist(&imgGreen,hist,0,0);
IplImage* histGreen= DrawHistogram(hist);
cvClearHist(hist); cvCalcHist(&imgRed,hist,0,0);
IplImage* histRed= DrawHistogram(hist);
cvClearHist(hist); cvNamedWindow("B");
cvNamedWindow("G");
cvNamedWindow("R"); cvShowImage("B",histBlue);
cvShowImage("G",histGreen);
cvShowImage("R",histRed);
cvWaitKey(0); return 0;
} 【12 RGB顏色空間】【未能實現】
//#include"stdafx.h"
//#include"cv.h"
#include"cxcore.h"
#include"highgui.h" int main(int argc,char*argv[])
{
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\1.jpg");
IplImage* dst=cvCreateImage(cvGetSize(src),8,3);
cvMerge(src,src,src,0,dst); cvNamedWindow("src");
cvShowImage("src",src);
//cvWaitKey(0);
cvNamedWindow("dst");
cvShowImage("dst",dst);
//cvWaitKey(0); /*cvReleaseImage(&src);
cvDestroyWindow("src");
cvReleaseImage(&dst);
cvDestroyWindow("dst");*/
return 0; } 【14 顏色空間轉換】 #include "stdafx.h"
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
int main(int argc,char*argv[])
{
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\1.jgp");
cvNamedWindow("src");
cvShowImage("src",hrc); /*
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\1.jpg");
IplImage* img_hsv=cvCreateImage(cvGetSize(src),8,3);//char型,8位
IplImage* img_h=cvCreateImage(cvGetSize(src),8,1);
IplImage* img_s=cvCreateImage(cvGetSize(src),8,1);
IplImage* img_v=cvCreateImage(cvGetSize(src),8,1);
*/ IplImage*src_float=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,3);//char型轉換成float
IplImage* src=cvLoadImage("D:\\opencvtest-demo\\1.jpg");
IplImage* img_hsv=cvCreateImage(cvGetSize(src),8,3);//char型,8位
IplImage* img_h=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1);
IplImage* img_s=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1);
IplImage* img_v=cvCreateImage(cvGetSize(src),IPL_DEPTH_32F,1); cvConvertScale(src,src_float,1.0,0);//最後那個0是偏移量
cvSplit(img_hsv,img_h,img_s,img_v,NULL);
IplImage* hsv=cvCreateImage(cvGetSize(src),8,3);//char型,8位
IplImage* h=cvCreateImage(cvGetSize(src),8,1);
IplImage* s=cvCreateImage(cvGetSize(src),8,1);
IplImage* v=cvCreateImage(cvGetSize(src),8,1); cvConvertScale(img_h,h,(1.0/360.0)*255.0,0);
cvConvertScale(img_s,s,255.0,0);
cvConvertScale(img_v,v,1.0,0); cvMerge(h,s,v,NULL,hsv);//合成
/*
cvConvertScale(img_h,h,(1.0));
cvCvtColor(src,img_hsv,CV_BGR2HSV);
cvSplit(img_hsv,img_h,img_s,img_v,NULL);
*/
cvNamedWindow("hsv");
cvShowImage("hsv",hsv);
for(int y=0;y<img_h->height;y++)
{ for(int x=0;x<img_h->width;x++)
{ float value=cvGetReal2D(img_h,y,x);
printf("%f",value);
}
//printf("\n");
}
}