 # Image/movie frame/capture frame pixel[] scan

This pertains to image/movie frame/capture frame pixel[] scan.
In the Coding Train examples Dan uses a nested FOR loop to check RGB values of each pixel. Within each loop the x/y coordinates are converted to pixel[] coordinates and then tested.
Could you folks have a look at this algorithm. I’m using a single FOR loop. It test pixel[] values and if it test TRUE only then does it calculate the x/y coordinates. I think it’s more streamline/efficient than the nested FOR loop which converts the x/y coordinates to pixel[] coordinates each loop. What do you think? I modified the “sketch_11_5_AveragePixelColorTracking” sketch with the code below. I am new to Processing 3, but not new to coding.
Thank you all for the knowledge you’ve given me.

``````// Begin loop to walk through every pixel
for (int pix = 0; pix < video.pixels.length -1; pix++ ) { //1 for loop only
// What is current color
color currentColor = video.pixels[pix];
float r1 = red(currentColor);
float g1 = green(currentColor);
float b1 = blue(currentColor);
float r2 = red(trackColor);
float g2 = green(trackColor);
float b2 = blue(trackColor);

float d = distSq(r1, g1, b1, r2, g2, b2);
// x and y are only calculated when needed
if (d < threshold*threshold) {
int y = floor(pix/video.width);
int x = pix - (video.width * y);
stroke(255);
strokeWeight(1);
point(x, y);
avgX += x;
avgY += y;
count++;
}

}
``````
1 Like

Great – that is a good strategy for efficiency, as is looking over the pixels array rather than using get – this is discussed here:

“Getting the color of a single pixel with get(x, y) is easy, but not as fast as grabbing the data directly from pixels[]https://processing.org/reference/get_.html

You don’t usually need to use point() (I don’t think?) or set() – unless you point has a non-normal strokeWeight – you can just use `pixels[y*width+x]`. https://processing.org/reference/set_.html

If you want to further optimize for speed, don’t use red() / green() / blue() – instead, use bit-shifting.

“The red() function is easy to use and understand, but it is slower than a technique called bit shifting.” https://processing.org/reference/red_.html

Coding Train code tends to be written for conceptual clarity – for teaching and learning – rather than for performance.

1 Like