opencv_趣味相框
流程設計
程式碼
Opencv1.0
opencv第一代(舊式C語言寫法)#include<iostream>
#include<stdio.h>
//opencv1
#include"opencv\cv.h"
#include"opencv\highgui.h"
//opencv2
#include"opencv2\highgui\highgui.hpp"
#include"opencv2\opencv.hpp"
//Kinect SDK
using namespace std;
using namespace cv;
int main()
{
/*抓攝影機*/
CvCapture *cap = cvCreateCameraCapture(0);
IplImage * frame1;//= cvQueryFrame(cap);
/*設定攝影機寬、高屬性,視窗命名、重設視窗大小*/
cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, 500);
cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, 700);
cvNamedWindow("趣味相框", 0);
cvResizeWindow("趣味相框", 500, 700);
/*圖像載入*/
IplImage* photo_bg = cvLoadImage("C:\\img_res\\photo_frame3.jpg");
cvNamedWindow("載入的圖", 0);
cvShowImage("載入的圖" , photo_bg );
/*創建一個mask 且size跟photo_bg的大小相同,圖像位元深度為8,單通道*/
IplImage* mask = cvCreateImage(cvGetSize(photo_bg), IPL_DEPTH_8U, 1);//opencv C 寫法
cvNamedWindow("創建的單通道遮罩", 0);
cvShowImage("創建的單通道遮罩", mask);
/*定義所需顏色範圍去做遮罩(B:220~256,G:220~256,R:220~256)*/
cvInRangeS(photo_bg, cvScalar(220, 220, 220), cvScalar(256, 256, 256), mask);
cvNamedWindow("設置好顏色範圍的遮罩", 0);
cvShowImage("設置好顏色範圍的遮罩", mask);
/*位元取反*/
cvNot(mask, mask);
/*秀出影像--遮罩顯示*/
cvNamedWindow("位元取反後的遮罩", 0);
cvShowImage("位元取反後的遮罩", mask);
/*影像複製--創建新的影像載具並將photo_bg的內容複製給它*/
IplImage * result = cvCloneImage(photo_bg);
/* C 的攝影機迴圈取frame 寫法*/
while (1)
{
frame1 = cvQueryFrame(cap);
//cvShowImage("Frame 1", frame1);
cvResize(frame1, result);
cvCopy(photo_bg, result, mask);
//void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );
cvShowImage("趣味相框", result);
int key = cvWaitKey(32); // space
if (key == 27)
break; // ESC
}
cvReleaseCapture(&cap);
cvReleaseImage(&frame1);
}
Opencv2.0
opencv第二代(C++語言寫法)
#include<iostream>
#include<stdio.h>
//opencv Library
#include"opencv\cv.h"
#include"opencv\highgui.h"
#include"opencv2\highgui\highgui.hpp"
#include"opencv2\opencv.hpp"
//Kinect SDK
#include"Kinect.h"
using namespace std;
using namespace cv;
int main()
{
/*抓攝影機*/
// C 寫法
/*
CvCapture *cap = cvCreateCameraCapture(0);
IplImage * frame1 = cvQueryFrame(cap);
*/
// C++ 寫法
VideoCapture cap(0);
Mat frame1;
/*設定攝影機寬、高屬性,視窗命名、重設視窗大小*/
// C 寫法
/*
cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_WIDTH, 500);
cvSetCaptureProperty(cap, CV_CAP_PROP_FRAME_HEIGHT, 700);
cvNamedWindow("趣味相框", 0);
cvResizeWindow("趣味相框", 500, 700);
*/
// C++寫法
cap.set(CV_CAP_PROP_FRAME_WIDTH, 500);
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 700);
namedWindow("趣味相框", 0);
resizeWindow("趣味相框", 500, 700);
/*圖像載入*/
// C 寫法
//IplImage* photo_bg = cvLoadImage("C:\\img_res\\photo_frame3.jpg");
// C++ 寫法
Mat photo_bg = imread("C:\\img_res\\photo_frame3.jpg");
/*創建一個mask 且size跟photo_bg的大小相同,圖像位元深度為8,單通道*/
//IplImage* mask = cvCreateImage(cvGetSize(photo_bg), IPL_DEPTH_8U, 1);//opencv C 寫法
//Mat mask( photo_bg.rows ,photo_bg.cols , CV_8UC1 ); //opencv C++寫法 (寫法1)
Mat mask(photo_bg.size(), CV_8SC1); //opencv C++寫法 (寫法2)
/*定義所需顏色範圍去做遮罩(B:220~256,G:220~256,R:220~256)*/
//cvInRangeS(photo_bg, cvScalar(220, 220, 220), cvScalar(256, 256, 256), mask);
//C: void cvInRangeS(const CvArr* src, CvScalar lower, CvScalar upper, CvArr* dst)
inRange(photo_bg, Scalar(220, 220, 220), Scalar(256, 256, 256), mask);
//C++: void inRange(InputArray src, InputArray lowerb, InputArray upperb, OutputArray dst)
/*位元取反*/
//cvNot(mask, mask);
//C: void cvNot(const CvArr* src, CvArr* dst)
bitwise_not(mask, mask);
//C++: void bitwise_not(InputArray src, OutputArray dst, InputArray mask = noArray())
/*秀出影像--遮罩顯示*/
// C 寫法
//cvShowImage("mask", mask);
// C++ 寫法
imshow("mask", mask);
/*影像複製--創建新的影像載具並將photo_bg的內容複製給它*/
// C 寫法
//IplImage * result = cvCloneImage(photo_bg);
//C: IplImage* cvCloneImage(const IplImage* image)
// C++寫法 三種複製法
/*寫法1 copyTo
慾複製內容的影像.coptTo(目標影像);
src.copyTo(des);
*/
/*
Mat result;
photo_bg.copyTo(result);
*/
/*寫法2 clone
目標影像 = 慾複製內容的影像.clone();
des = src.clone();
*/
Mat result = photo_bg.clone();
/*寫法3 用等號*/
//Mat result = photo_bg; //兩者共用一份數據改一個另一個一起改喔!!!
/* C 的攝影機迴圈取frame 寫法*/
/*
while (1)
{
frame1 = cvQueryFrame(cap);
//cvShowImage("Frame 1", frame1);
cvResize(frame1, result);
cvCopy(photo_bg, result, mask);
//void cvCopy( const CvArr* src, CvArr* dst, const CvArr* mask=NULL );
cvShowImage("數位相框", result);
int key = cvWaitKey(32); // space
if (key == 27)
break; // ESC
}
cvReleaseCapture(&cap);
//cvDestroyWindow("Frame 1");
cvReleaseImage(&frame1);
*/
/* C++ 的攝影機迴圈取frame 寫法*/
while (1)
{
cap >> frame1;
//imshow("趣味相框", frame1);
resize(frame1, result, result.size());
//src.copyTo(des , mask);
photo_bg.copyTo(result, mask);
imshow("趣味相框", result);
if (waitKey(32) >= 0)
break;
}
system("PAUSE");
}
少了位元取反流程的顯示結果
本次工作分享 先到這
留言
張貼留言