If you want to simplify the circuit further, I'd suggest you to use this circuit which uses just one resistor and dual channel optocoupler (K814P) on the line side:
This will give you peaks at each zero cross which you can use as a time reference for your dimming delay. This is a working and tested circuit.
Before using it, you need to keep something in mind, though. Zero cross detection will not be infinitely sharp peak. In reality it will be like this:
Blue is mains supply (220V 50 Hz) and yellow is circuit output (on a 3.3V system).
The peak will be observed at zero cross but your micro-controller (arduino) will detect Logic HIGH or Logic LOW a few ms before the peak and lowest output voltage respectively. Why? Because on a 3.3V system, any voltage above 2V will be interpreted as HIGH. Something similar will happen for a 5V system.
Besides this, any voltage above 0.8V can also be interpreted as HIGH sometimes. So, there is a region where you can't be sure about the logic levels that your micro-controller can see. To be on the safer side, you need to stay out of that zone. Consider this:
As seen here, 0.8 V is the max voltage which confirms a definite logic LOW signal. Any signal more than that might be recorded as HIGH.
Taking worst case scenario of HIGH detection at 0.8V itself, if the triac is turned on within 1.3 ms period of HIGH detection, it might lead to an unreliable behavior. If a minimum delay of 2 ms is assured in the code, it will ensure a robust dimming of the device without any flicker.
For max delay, considering the worst case scenario of zero detection at 2V, max delay can be 9.5ms. However to be on the safer side, a max delay of 9ms should be used. For a 5V system and exact parts chosen, the timing might be a little off but you should be able to program by trial and error.