Apply Fisheye Effect
Bending flat images into a fisheye view
- image
- IMAGE
Want that wide, everything-curling-toward-the-edges action-cam look on a perfectly ordinary flat image? Fisheye ("Apply Fisheye Effect" in the menu) is the node for it. It takes any image, treats it as a normal rectilinear photo, and re-projects it through one of four real fisheye lens models until straight lines bow and the scene wraps around a virtual lens. It's the sibling of Defisheye in the same pack - this one goes in the other direction.
People reach for it in three spots: giving a generated scene the action-cam or security-dome vibe, distorting an image before an img2img pass so the sampler matches a fisheye source, or as a finishing effect on a photography workflow. Because it's pure geometry - OpenCV remap, zero diffusion - it's fast and deterministic, and you can chain it with its inverse in the same graph (the repo's example workflow is literally "BackAndForth").
How it works
The math is the standard fisheye projection family. You pick a mapping model - equidistant, equisolid, orthographic, or stereographic - and the node builds a coordinate map that pushes each pixel outward from the lens center according to that model's radius formula, then resamples with cv2.remap. equidistant is the default and the most "normal" action-cam look; stereographic gives that dreamy all-sky dome distortion. Torch only shuttles the tensor in and out; the heavy lifting is numpy and OpenCV, so no GPU needed and no models to download.
The inputs that matter
Eight inputs, but a beginner lives in three:
- image - the flat image going in.
- fov - how wide the fisheye output is, in degrees. Default 180 is the classic half-sphere fisheye. Dial it up toward 240+ for more aggressive bend, down for subtle.
- pfov - the perspective FOV the source image is assumed to have. This one's counterintuitive: a high pfov treats your flat input as a very wide shot, so the same fov produces more dramatic distortion. Default 120 is a fine starting point.
- format -
circulargives the classic round lens image with black corners (the full-dome look);fullframegives the rectangular GoPro-crop look where the circle is cropped off. The examples in the repo show both side by side.
wcenter and hcenter (0–1) shift where the lens sits, and entire_image forces the full uncropped view even when fov/pfov would normally crop. Output is a single IMAGE, straight into a PreviewImage, SaveImage, or back into the sampler pipeline.
Install
Via ComfyUI Manager, search "ComfyUI Fisheye Effects" in the Custom Nodes Manager. Or the manual route:
cd ComfyUI/custom_nodes
git clone https://github.com/Kidev/ComfyUI-Fisheye-effects
cd ComfyUI-Fisheye-effects
python install.py # or: pip install -r requirements.txt in your venv
Restart ComfyUI after. Dependencies are numpy, opencv-python, torch, and Pillow. opencv-python is the one likely missing from an existing ComfyUI install; there are no model files or keys anywhere in this pack.
Where people get burned
First, know that distortion crushes the corners - that's the point of the effect, but it means text, faces, and fine detail near the edges will smear, so frame your subject toward center. Second, if format = circular shows nothing but a black surround that feels too aggressive, switch to fullframe; beginners often don't realize the two are different crops, not just cosmetic.
And the same caveat that bites on its sibling: this is a single-image node. Feed it a batch from a video loader and it silently processes only the first frame, then returns a single image. If you're distorting a whole animation, loop it per-frame yourself.
One last tip: if your fisheye result looks more like abstract liquid than a lens, your pfov is too high relative to fov. Drop pfov toward 90 and it settles into a believable wide-angle bend. And when you want to undo the effect, match the mapping, fov, and pfov exactly in the Defisheye node - the BackAndForth example shows the recipe.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| mapping | COMBO | 4 options: equidistant, equisolid, orthographic, stereographic | |
| format | COMBO | 2 options: fullframe, circular | |
| fov | FLOAT | 1800–360 | — |
| pfov | FLOAT | 1200–360 | — |
| entire_image | BOOLEAN | false | — |
| wcenter | FLOAT | 0.50–1 | — |
| hcenter | FLOAT | 0.50–1 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |