吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1863|回复: 4
收起左侧

[已解决] 小白再来问c++

[复制链接]
吾爱破jie 发表于 2019-11-26 19:07
本帖最后由 吾爱破jie 于 2019-11-26 20:55 编辑

[C++] 纯文本查看 复制代码
/*ofAPP*/
#include "ofApp.h"

int pointx;
int pointy;
void ofApp::skin(Mat src)
{
        src.convertTo(src, CV_8UC3, 255);
        Mat yuv, dst;
        cvtColor(src, yuv, CV_BGR2YCrCb);
        Mat dstTemp1(src.rows, src.cols, CV_8UC1);
        Mat dstTemp2(src.rows, src.cols, CV_8UC1);
        // 对YUV空间进行量化,得到2值图像,亮的部分为手的形状
        inRange(yuv, Scalar(0, 133, 0), Scalar(256, 173, 256), dstTemp1);
        inRange(yuv, Scalar(0, 0, 77), Scalar(256, 256, 127), dstTemp2);
        bitwise_and(dstTemp1, dstTemp2, mask);
        dst.setTo(Scalar::all(0));

        bitwise_and(mask, mask0, mask);
        src.copyTo(dst, mask);

        vector< vector<Point> > contours;        // 轮廓
        vector< vector<Point> > filterContours;        // 筛选后的轮廓
        vector< Vec4i > hierarchy;        // 轮廓的结构信息
        vector< Point > hull;        // 凸包络的点集
        contours.clear();
        hierarchy.clear();
        filterContours.clear();

        // 得到手的轮廓
        findContours(mask, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_SIMPLE);
        // 去除伪轮廓
        for (size_t i = 0; i < contours.size(); i++)
        {
                //approxPolyDP(Mat(contours[i]), Mat(approxContours[i]), arcLength(Mat(contours[i]), true)*0.02, true);
                if (fabs(contourArea(Mat(contours[i]))) > 1000 && fabs(arcLength(Mat(contours[i]), true)) < 2000)        //判断手进入区域的阈值
                {
                        filterContours.push_back(contours[i]);
                }
        }
        //cout << contours[0][0].x << "        " << contours[0][0].y << endl;
        //SetCursorPos(contours[0][0].x, contours[0][0].y);
        pointx = 400;
        pointy = 455;

        // 画轮廓
        drawContours(src, filterContours, -1, Scalar(0, 0, 255), 2); //8, hierarchy);
        //drawContours(src, filterContours, 0, Scalar(255), CV_FILLED);
        imshow("traclking", src);
}


[C++] 纯文本查看 复制代码
/*ofApp.h*/
#pragma once

#include "ofMain.h"
#include "demoParticle.h"

using namespace cv;
using namespace std;

class ofApp : public ofBaseApp{

        public:

                void skin(Mat src);

};

[C++] 纯文本查看 复制代码
/*demoParticle.cpp*/

#include "demoParticle.h"
#include "ofAppBaseWindow.h"
#include "ofApp.h"

void demoParticle::update(){
        //extern int pointx;
        //cout << pointx << endl;

        //1 - APPLY THE FORCES BASED ON WHICH MODE WE ARE IN 
        
        if( mode == PARTICLE_MODE_ATTRACT ){

                ofPoint attractPt(pointx, pointy);
                frc = attractPt-pos; // we get the attraction force/vector by looking at the mouse pos relative to our pos
                frc.normalize(); //by normalizing we disregard how close the particle is to the attraction point 
                
                vel *= drag; //apply drag
                vel += frc * 0.6; //apply force
        }
        else if( mode == PARTICLE_MODE_REPEL ){

                ofPoint attractPt(pointx, pointy);
                frc = attractPt-pos; 
                
                //let get the distance and only repel points close to the mouse
                float dist = frc.length();
                frc.normalize(); 
                
                vel *= drag; 
                if( dist < 150 ){
                        vel += -frc * 0.6; //notice the frc is negative 
                }else{
                        //if the particles are not close to us, lets add a little bit of random movement using noise. this is where uniqueVal comes in handy.                         
                        frc.x = ofSignedNoise(uniqueVal, pos.y * 0.01, ofGetElapsedTimef()*0.2);
                        frc.y = ofSignedNoise(uniqueVal, pos.x * 0.01, ofGetElapsedTimef()*0.2);
                        vel += frc * 0.04;
                }
        }
        else if( mode == PARTICLE_MODE_NOISE ){
                //lets simulate falling snow 
                //the fake wind is meant to add a shift to the particles based on where in x they are
                //we add pos.y as an arg so to prevent obvious vertical banding around x values - try removing the pos.y * 0.006 to see the banding
                float fakeWindX = ofSignedNoise(pos.x * 0.003, pos.y * 0.006, ofGetElapsedTimef() * 0.6);
                
                frc.x = fakeWindX * 0.25 + ofSignedNoise(uniqueVal, pos.y * 0.04) * 0.6;
                frc.y = ofSignedNoise(uniqueVal, pos.x * 0.006, ofGetElapsedTimef()*0.2) * 0.09 + 0.18;

                vel *= drag; 
                vel += frc * 0.4;
                
                //we do this so as to skip the bounds check for the bottom and make the particles go back to the top of the screen
                if( pos.y + vel.y > ofGetHeight() ){
                        pos.y -= ofGetHeight();
                }
        }
        else if( mode == PARTICLE_MODE_NEAREST_POINTS ){
                
                if( attractPoints ){

                        //1 - find closest attractPoint 
                        ofPoint closestPt;
                        int closest = -1; 
                        float closestDist = 9999999;
                        
                        for(unsigned int i = 0; i < attractPoints->size(); i++){
                                float lenSq = ( attractPoints->at(i)-pos ).lengthSquared();
                                if( lenSq < closestDist ){
                                        closestDist = lenSq;
                                        closest = i;
                                }
                        }
                        
                        //2 - if we have a closest point - lets calcuate the force towards it
                        if( closest != -1 ){
                                closestPt = attractPoints->at(closest);                                
                                float dist = sqrt(closestDist);
                                
                                //in this case we don't normalize as we want to have the force proportional to distance 
                                frc = closestPt - pos;
                
                                vel *= drag;
                                 
                                //lets also limit our attraction to a certain distance and don't apply if 'f' key is pressed
                                if( dist < 300 && dist > 40 && !ofGetKeyPressed('f') ){
                                        vel += frc * 0.003;
                                }else{
                                        //if the particles are not close to us, lets add a little bit of random movement using noise. this is where uniqueVal comes in handy.                         
                                        frc.x = ofSignedNoise(uniqueVal, pos.y * 0.01, ofGetElapsedTimef()*0.2);
                                        frc.y = ofSignedNoise(uniqueVal, pos.x * 0.01, ofGetElapsedTimef()*0.2);
                                        vel += frc * 0.4;
                                }
                                
                        }
                
                }
                
        }
        
        
        //2 - UPDATE OUR POSITION
        
        pos += vel; 
        
        
        //3 - (optional) LIMIT THE PARTICLES TO STAY ON SCREEN 
        //we could also pass in bounds to check - or alternatively do this at the ofApp level
        if( pos.x > ofGetWidth() ){
                pos.x = ofGetWidth();
                vel.x *= -1.0;
        }else if( pos.x < 0 ){
                pos.x = 0;
                vel.x *= -1.0;
        }
        if( pos.y > ofGetHeight() ){
                pos.y = ofGetHeight();
                vel.y *= -1.0;
        }
        else if( pos.y < 0 ){
                pos.y = 0;
                vel.y *= -1.0;
        }        
                
}



[C++] 纯文本查看 复制代码
/*demoParticle.h*/
#pragma once
#include "ofMain.h"
extern int pointx;
extern int pointy;

enum particleMode{
        PARTICLE_MODE_ATTRACT = 0,
        PARTICLE_MODE_REPEL,
        PARTICLE_MODE_NEAREST_POINTS,
        PARTICLE_MODE_NOISE
};


class demoParticle{

        public:
                demoParticle();
                

                void update();

};

如图一图二
我在ofApp.cpp中定义了并复制了两个全局变量
然后图三我声明了全局变量
图四中我调用这两个变量,结果为零,却不是我赋值的那两个数,怎么回事

图一

图一

图二

图二

图三

图三

图四

图四

免费评分

参与人数 1吾爱币 +1 收起 理由
qzhy + 1 鼓励转贴优秀软件安全工具和文档!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

你与明日 发表于 2019-11-26 19:18
你连JAVA  , PYTHON这些都没学过吧....

从你发出来的图片内,我没看到你调用ofApp::skin这个函数,你的全局变量都没进行赋值

这是最后一次回复你的问题........

其实单步调试也可以发现问题的所在....
 楼主| 吾爱破jie 发表于 2019-11-26 19:27
你与明日 发表于 2019-11-26 19:18
你连JAVA  , PYTHON这些都没学过吧....

从你发出来的图片内,我没看到你调用ofApp::skin这个函数,你的全 ...

代码太多了大佬,我只把重要关键函数发出来了,几千行一个cpp
lxm1992 发表于 2019-11-26 20:21
实在不行,就自己调试找下问题嘛,先在赋值那个地方打个断点,看有没有进函数给赋值,然后在使用全局变量的函数那块也打个断点,看会不会进函数以及值的变化,如果说变量被赋值后面又成0,那你就先找到它时候被赋值啥时候成的0,找到这俩节点,你自己就能改了,这个问题不难解决,你可以先自己试一下
1sina 发表于 2019-11-26 20:49
高深莫测
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 22:49

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表