Invert video to negative


#1

Hello. I’ve been working recently with a Blackmagic capture card thanks to the advise and guidance of some members of this forum and now I’m stuck with a problem. I want to take the video that I’m capturing and invert it when I activate a button from the Gui. I already did something similar before with a webcam by creating first an ofPixels object and allocating to it the video grabber, and then passing it to an ofTexture. I wanted to do something similar but the application crashes because of a segmentation fault.

void ofApp::update(){

    if(cam.update()) {
        timer.tick();

        //copiar frames a videoPix
        ofPixels& pixels = cam.getColorPixels();



        if(invert){
            for(size_t i = 0; i < pixels.size(); i ++){
                videoPix[i] = 255 - pixels[i];
                //videoTex.loadData(videoPix);
                continue;

            }
        }
        else{

            for (size_t i = 0; i < pixels.size(); i ++){
                videoPix[i] = pixels[i];
                //videoTex.loadData(videoPix);
                continue;
        }


            //videoTex.loadData(videoPix);
    }
    }
}


//--------------------------------------------------------------
void ofApp::draw(){
    ofBackgroundGradient(ofColor::white, ofColor::gray);
    //cam.drawColor(20,(((height/3) *2) - (576/2)),camWidth, camHeight);



    videoTex.loadData(videoPix);
    videoTex.draw(20,(((height/3) *2) - (576/2)),camWidth, camHeight);

Any idea?


#2

whats your ofapp.h or where you declare everything? Perhaps there is an out-of-bounds access in videoPix in your update function.


#3

Yes, sorry, here is where I declare the variables:

#pragma once
#include "ofxBlackMagic.h"
#include "ofxGuiExtended.h"
#include "ofMain.h"
#include <iostream>


class RateTimer {
protected:
    float lastTick, averagePeriod, smoothing;
    bool secondTick;
public:
    RateTimer() :
    smoothing(.9) {
        reset();
    }
    void reset() {
        lastTick = 0, averagePeriod = 0, secondTick = false;
    }
    void setSmoothing(float smoothing) {
        this->smoothing = smoothing;
    }
    float getFramerate() {
        return averagePeriod == 0 ? 0 : 1 / averagePeriod;
    }
    void tick() {
        float curTick = ofGetElapsedTimef();
        if(lastTick == 0) {
            secondTick = true;
        } else {
            float curDiff = curTick - lastTick;;
            if(secondTick) {
                averagePeriod = curDiff;
                secondTick = false;
            } else {
                averagePeriod = ofLerp(curDiff, averagePeriod, smoothing);
            }
        }
        lastTick = curTick;
    }
};




class ofApp : public ofBaseApp{

	public:
		void setup();
		void update();
		void draw();
        void exit();

		void keyPressed(int key);
		void keyReleased(int key);
		void mouseMoved(int x, int y );
		void mouseDragged(int x, int y, int button);
		void mousePressed(int x, int y, int button);
		void mouseReleased(int x, int y, int button);
		void mouseEntered(int x, int y);
		void mouseExited(int x, int y);
		void windowResized(int w, int h);
		void dragEvent(ofDragInfo dragInfo);
		void gotMessage(ofMessage msg);
		
        ofxBlackMagic cam;
        RateTimer timer;

        ofBuffer buffer;

        int width = ofGetWidth();
        int height = ofGetHeight();

        int screenSize = (width, height);

        ofColor color;
        ofImage lastFrame;
        ofVideoGrabber grabber;

        ofPixels prueba;
        string test;




private:

        ofxGui gui;
        int camWidth = 1024;
        int camHeight = 576;

        ofPixels videoPix;
        ofTexture videoTex;

        ofxGuiContainer *containerExample;
        ofxGuiGroup *groupExample;
        ofxGuiPanel *panelExample;

        ofParameterGroup settings;
        ofParameter<void> addOutput;
        ofParameterGroup project, inputFormat, directory;
        ofParameter<string> name, title, path;
        ofParameter<bool> invert, flip;
        ofParameter<int> filmFormat;




        ofxGuiTextField name2;
        ofxGuiPanel *panel1;


};

///


#4

Sorry I didnt get back to you! But you can try accessing video pixels with setColor, not with square brakets in line

videoPix[i] = pixels[i];

https://openframeworks.cc/documentation/graphics/ofPixels/#show_setColor