最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ OpenCV實現抖音"藍線挑戰(zhàn)"特效

 更新時間:2022年01月17日 08:41:32   作者:Zero___Chen  
這篇文章主要介紹了如何使用OpenCV C++ 實現抖音上的特效“藍線挑戰(zhàn)”。文中的示例代碼講解詳細,對我們學習OpenCV有一定的幫助,需要的可以參考一下

前言

本文將使用OpenCV C++ 實現抖音上的特效“藍線挑戰(zhàn)”。雖然看起來覺得很牛的樣子,但如果了解其中的原理就非常簡單了。本案例是我自己對于這個特效實現過程的理解,僅供參考。

算法原理可以分為三個流程:

1、將視頻(圖像)從(頂->底)或(左->右)逐行(列)掃描圖像。

2、將掃描完成的行(列)像素重新生成定格圖像。

3、使用原幀圖像像素填充未掃描到的像素。

接下來就具體來看看是如何實現的吧。

一、圖像掃描

首先第一步,拿到一個視頻(很多幀圖像)可以簡單的看成圖像處理。我們需要將圖像從頂到底逐行進行像素掃描,當然也可以從左到右逐列掃描,這要看你想要實現什么樣的效果。在這里,我實現的是從上到下逐行掃描。效果如圖所示。

二、生成定格圖像

所謂生成定格圖像就是將我們每掃描到的行像素重新進行繪制。

    //從頂向下逐行掃描圖像
    if (h < height)
    {
        h++;
        //將掃描到的圖像像素進行重新繪制,生成新圖像
        for (int j = 0; j < width; j++)
        {
            for (int c = 0; c < 3; c++)
            {
                temp.at<Vec3b>(h, j)[c] = canvas.at<Vec3b>(h, j)[c];
            }
        }
        //繪制掃描過程
        line(canvas, Point(0, h), Point(width, h), Scalar(255, 255, 0), 2);
    }

如圖所示,這是使用上面代碼段實現的逐行掃描生成定格圖像。從效果上看,已經得到了我們想要的大致效果了。不過現在的問題是,經掃描到的行有像素填充,未掃描到的行還是漆黑一片。所以接下來我們需要做的就是將未掃描到的行用原圖進行填充。具體請看源碼注釋。

三、圖像混合

//將兩幅圖像進行線性混合
bool Linear_Blend(Mat src1, Mat src2, Mat& dst)
{
?? ?/*
?? ?參數說明:
?? ?src1:生成的定格圖像。由于生成的定格圖像是從頂往下逐行掃描,故在掃描線下的像素為0
?? ?src2:原視頻幀圖像
?? ?dst:新生成的定格圖像。
?? ?算法原理:經掃描到的像素用src1進行填充,未掃描到的像素用src2進行填充,這樣就可以得到我們所要的效果了。
?? ?*/

?? ?for (int i = 0; i < src1.rows; i++)
?? ?{
?? ??? ?for (int j = 0; j < src1.cols; j++)
?? ??? ?{
?? ??? ??? ?for (int c = 0; c < 3; c++)
?? ??? ??? ?{
?? ??? ??? ??? ?if (src1.at<Vec3b>(i, j)[0] != 0)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?dst.at<Vec3b>(i, j)[c] = src1.at<Vec3b>(i, j)[c];
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?dst.at<Vec3b>(i, j)[c] = src2.at<Vec3b>(i, j)[c];
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ?}

?? ?return true;
}

四、效果顯示

如上圖所示,至此我們已經完成了案例所想要的效果。請參考源碼,注釋也比較詳細了。

五、源碼

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

/*
抖音特效:藍線挑戰(zhàn)
算法原理:
?? ?1、將視頻(圖像)從(頂->底)或(左->右)逐行(列)掃描圖像。
?? ?2、將掃描完成的行(列)像素重新生成定格圖像
?? ?3、使用原幀圖像像素填充未掃描到的像素
*/

//將兩幅圖像進行線性混合
bool Linear_Blend(Mat src1, Mat src2, Mat& dst)
{
?? ?/*
?? ?參數說明:
?? ?src1:生成的定格圖像。由于生成的定格圖像是從頂往下逐行掃描,故在掃描線下的像素為0
?? ?src2:原視頻幀圖像
?? ?dst:新生成的定格圖像。
?? ?算法原理:經掃描到的像素用src1進行填充,未掃描到的像素用src2進行填充,這樣就可以得到我們所要的效果了。
?? ?*/

?? ?for (int i = 0; i < src1.rows; i++)
?? ?{
?? ??? ?for (int j = 0; j < src1.cols; j++)
?? ??? ?{
?? ??? ??? ?for (int c = 0; c < 3; c++)
?? ??? ??? ?{
?? ??? ??? ??? ?if (src1.at<Vec3b>(i, j)[0] != 0)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?dst.at<Vec3b>(i, j)[c] = src1.at<Vec3b>(i, j)[c];
?? ??? ??? ??? ?}
?? ??? ??? ??? ?else
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?dst.at<Vec3b>(i, j)[c] = src2.at<Vec3b>(i, j)[c];
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ?}
?? ?}

?? ?return true;
}

int main()
{
?? ?VideoCapture capture;
?? ?capture.open("test.avi");
?? ?if (!capture.isOpened())
?? ?{
?? ??? ?cout << "can not open the camera!" << endl;
?? ??? ?system("pause");
?? ??? ?return -1;
?? ?}

?? ?int width = capture.get(CAP_PROP_FRAME_WIDTH);//視頻幀寬
?? ?int height = capture.get(CAP_PROP_FRAME_HEIGHT);//視頻幀高

?? ?//保存視頻
?? ?VideoWriter writer;
?? ?int fourcc = writer.fourcc('m', 'p', '4', 'v'); //視頻編碼
?? ?Size size(capture.get(CAP_PROP_FRAME_WIDTH), capture.get(CAP_PROP_FRAME_HEIGHT));
?? ?writer.open("result.avi", fourcc, 30, size, true);

?? ?int h = 0;//定義變量,代表當前掃描高度

?? ?//用于生成定格照
?? ?Mat temp = Mat::zeros(Size(width, height), CV_8UC3);
?? ?
?? ?Mat frame;
?? ?while (capture.read(frame))
?? ?{
?? ??? ?//將圖像拷貝一份,用于每幀更新
?? ??? ?Mat canvas = frame.clone();

?? ??? ?//從頂向下逐行掃描圖像
?? ??? ?if (h < height)
?? ??? ?{
?? ??? ??? ?h++;
?? ??? ??? ?//將掃描到的圖像像素進行重新繪制,生成新圖像
?? ??? ??? ?for (int j = 0; j < width; j++)
?? ??? ??? ?{
?? ??? ??? ??? ?for (int c = 0; c < 3; c++)
?? ??? ??? ??? ?{
?? ??? ??? ??? ??? ?temp.at<Vec3b>(h, j)[c] = canvas.at<Vec3b>(h, j)[c];
?? ??? ??? ??? ?}
?? ??? ??? ?}
?? ??? ??? ?//繪制掃描過程
?? ??? ??? ?line(canvas, Point(0, h), Point(width, h), Scalar(255, 255, 0), 2);
?? ??? ?}

?? ??? ?Mat result = Mat::zeros(frame.size(), frame.type());//藍線挑戰(zhàn)最終定格圖
?? ??? ?Linear_Blend(temp, canvas, result); //將兩張圖像進行像素疊加

?? ??? ?//writer.write(temp);//進行視頻保存

?? ??? ?imshow("定格圖像", temp);
?? ??? ?imshow("原視頻幀", canvas);
?? ??? ?imshow("藍線挑戰(zhàn)", result);

?? ??? ?char key = waitKey(10);
?? ??? ?if (key == 27) break;
?? ?}

?? ?capture.release();
?? ?system("pause");
?? ?return 0;
}

總結

本文使用OpenCV C++ 實現抖音特效“藍線挑戰(zhàn)”,關鍵步驟有以下幾點。

1、將圖像進行逐行掃描

2、將掃描到的像素逐行生成定格圖像

3、將定格圖像與原圖像進行像素疊加。

以上就是C++ OpenCV實現抖音"藍線挑戰(zhàn)"特效的詳細內容,更多關于C++ OpenCV藍線挑戰(zhàn)特效的資料請關注腳本之家其它相關文章!

相關文章

  • C語言中的奇技淫巧

    C語言中的奇技淫巧

    學習C語言的過程中,總會遇到很多令人眼前一亮的代碼,尤其是你寫了幾十行的代碼,別人只用了簡單幾行的遞歸就實現的功能。下面我就總結幾個C語言中 比較新手向的代碼。讓你有一種woc!還能這么寫的想法
    2018-08-08
  • 用C語言簡單實現掃雷小游戲

    用C語言簡單實現掃雷小游戲

    這篇文章主要為大家詳細介紹了用C語言簡單實現掃雷小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-08-08
  • C語言中的遞歸,你真的懂了嗎?

    C語言中的遞歸,你真的懂了嗎?

    這篇文章主要給大家介紹了關于C語言中遞歸的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-11-11
  • C/C++中CONST用法總結(推薦)

    C/C++中CONST用法總結(推薦)

    這篇文章主要介紹了C/C++中CONST用法總結(推薦),包括const常量與define宏定義的區(qū)別介紹,非常不錯,具有參考借鑒價值,需要的朋友參考下吧
    2017-07-07
  • C語言數據結構之二叉鏈表創(chuàng)建二叉樹

    C語言數據結構之二叉鏈表創(chuàng)建二叉樹

    這篇文章主要介紹了C語言數據結構之?二叉鏈表創(chuàng)建二叉樹,下文我們?yōu)榱烁奖愕氖褂枚鏄浣Y構體,可以使用?typedef?對結構體進行命名,具體內容需要的小伙伴可以參考一下
    2022-02-02
  • C++通過循環(huán)實現猜數字小游戲

    C++通過循環(huán)實現猜數字小游戲

    這篇文章主要為大家詳細介紹了C++通過循環(huán)實現猜數字小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • C++中的繼承方式與菱形繼承解析

    C++中的繼承方式與菱形繼承解析

    這篇文章主要介紹了C++中的繼承方式與菱形繼承解析,繼承是類和類之間的關系,是代碼復用的重要手段,允許在保持原有類結構的基礎上進行擴展,創(chuàng)建的新類與原有的類類似,只是多了幾個成員變量和成員函數,需要的朋友可以參考下
    2023-08-08
  • libevent庫的使用方法實例

    libevent庫的使用方法實例

    這篇文章主要介紹了libevent庫的使用方法實例,有需要的朋友可以參考一下
    2013-12-12
  • 深入第K大數問題以及算法概要的詳解

    深入第K大數問題以及算法概要的詳解

    本篇文章是對第K大數問題以及算法概要進行了詳細的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中MFC Tab Control控件的使用詳解

    C++中MFC Tab Control控件的使用詳解

    這篇文章主要介紹了C++中MFC Tab Control控件的使用詳解的相關資料,需要的朋友可以參考下
    2015-06-06

最新評論

曲水县| 新巴尔虎左旗| 宣城市| 蒲江县| 怀柔区| 正安县| 开远市| 阳高县| 个旧市| 吴川市| 大洼县| 本溪| 张家港市| 龙州县| 达州市| 久治县| 安龙县| 安平县| 博客| 兴仁县| 武隆县| 永年县| 望都县| 广德县| 新巴尔虎左旗| 锦屏县| 辽阳县| 惠来县| 麻城市| 昌平区| 兰溪市| 临漳县| 樟树市| 安吉县| 马鞍山市| 宜阳县| 阳原县| 哈密市| 三门峡市| 庆元县| 洛隆县|