I'm not sure, but when changing the texture rect, do just change it's position or also it's size?
You should keep the size of the rect always the same and only change the 'position' of the rectangle on the texture. With that you set the origin once and it always applies to your character.
Of course it will 'waste' a bit more image space, since you'll have empty places above the crouch frames, but that doesn't really hurt...
As for collision detection and other physic stuff that would depend on the sprite rectangle, it's better to separate the graphic and logic part, thus you should use the texture rect as your input for the collision detection (or if so convert it to match the current state).