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






少了位元取反流程的顯示結果







本次工作分享 先到這


留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

(2021年度)駕訓學科筆試準備題庫歸納分析_法規是非題