1. 程式人生 > >《opencv3程式設計入門》程式碼(配合網盤視訊,C語言)

《opencv3程式設計入門》程式碼(配合網盤視訊,C語言)

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