I have a large sequence of large images (1920x1080) that I am loading in to a vector. I need to be able to iterate through these images, pick the darkest pixel at each point across all of the frames, and dump the result into a new image.
I managed to get this running fairly quickly in Processing by creating multiple threads, each assigned to process a single line of pixels. Each thread would get a reference to an array, and a reference to the final image. Because Processing passes objects by reference, I’m able to update the image I am rendering while drawing it in real time without having to return any values.
I have tried to implement this in oFx. Running the analysis in the main portion of the application works fine when it is not threaded. However, once I push this process out to threads, I get Poco::Thread and Poco::FastMutex errors (‘operator=’ is a private member).
Overall, I’m fairly new to openFrameworks and C++, but my guess is that this has to do with trying to pass these object by reference. Is there a better/more proper/more efficient way of going about this?
Below is some psuedocode to illustrate the basics of my pixel processing loop.
vector<ofImage> images; //reference to vector of images loaded in main.cpp
ofImage finalImage; //reference to image created in main.cpp
int pixelStartX;
int pixelStartY;
int pixelEndX;
int pixelEndY;
void myThreadUpdateLoop(){
for(int pixelY = pixelStartY; pixelY < pixelEndY; pixelY++){
for(int pixelX = pixelStartX; pixelX < pixelEndX; pixelX++){
finalImage.setPixel(pixelX, pixelY, findDarkestColor(pixelX,pixelY));
}
}
}
/*looks at the pixel in this location in all the frames and find the darkest*/
ofColor findDarkestColor(pixelX, pixelY){
for(int frame = 0; frame < images.length; frame++){
/*code for comparing pixels at this given point across all frames, determining
which is the darkest and returning that color*/
}
}