Contribute
You can help contribute to ATT&CK.
ATT&CK is in a constant state of development. We are always on the lookout for new information to help refine and extend what is covered. If you have additional techniques, know about variations on one already covered, have examples of techniques in use, or have other relevant information, then we would like to hear from you.
We are looking for contributions in the following areas in particular, but if you have other information you think may be useful, please reach us at<EMAIL_ADDRESS>All contributions and feedback to ATT&CK are appreciated. Due to the high volume of contributions, it may take us about a week to get back to you. We may ask you follow-up questions to help us understand your contribution and gather additional information. We recommend you read our philosophy paper to understand our approach to maintaining ATT&CK so that we get the right details up front. If we find the contribution fills a gap, then we will make edits and send you a draft version of the technique or Group/Software page for your review prior to it being published, listing you as a contributor if desired. Content updates happen roughly every 3-6 months.
Contributing to ATT&CK
Techniques
We appreciate your help to let us know about what new techniques and technique variations adversaries and red teamers are using. You can start by emailing us the technique name, a brief description, and references or knowledge about how it is being used by adversaries or red teams. We suggest you take a close look at what we already have on our site, paying attention to the level of abstraction of techniques. Since we are working on adding new technique details constantly, we will deconflict what you send with what we’re working on. We’ll provide feedback and work with you to get the content added.
macOS and Linux
While we are looking for new techniques for Windows, macOS, and Linux, we are interested in macOS and Linux techniques in particular since there is a lack of publicly available threat intel for techniques used against those systems. This leads to gaps in the knowledge base that you can help fill.
Threat Intelligence
We map Group and Software examples on our site, and there is too much open source threat intelligence reporting for us to keep up on everything. We appreciate your help with referenced information about how Groups and Software samples use ATT&CK techniques. Threat intelligence contributions are most helpful to us when they are in the specific format we have on our website, including citing techniques and group names or associated groups to publicly-available references. We ask that you provide the technique name, a brief description of how the technique is implemented, and the publicly-available reference.
Data Sources
We often don’t have direct access to endpoint or network log data for technique use in incidents. We’re always looking for partners who would be interested in sharing relevant data from logs that show how adversaries are using ATT&CK techniques beyond what appears in threat reporting.
Your Use Cases
It’s always helpful for us to hear about how you’re using ATT&CK in your organization. We appreciate any information you can share with us about your specific use case or application of ATT&CK, and particularly any success stories you’ve had as a result.
Contribution Examples
New Technique Example
Technique Name:
COM, ROM, & BE GONE
Tactic:
Persistence
Platform:
Windows
Required Permissions:
User
Data Sources: Windows API, Process monitoring, or other sources that can be used to detect this activity
Description: Component Object Model (COM) servers associated with Graphics Interchange Format (GIF) image viewers can be abused to corrupt arbitrary memory banks. Adversaries may leverage this opportunity to modify, mux, and maliciously annoy (MMA) read-only memory (ROM) regularly accessed during normal system operations.
Detection: Monitor the JIF viewers for muxing and malicious annoyance. Use event ID 423420 and 234222 to detect changes.
Mitigation: Configure the Registry key HKLM\SYSTEM\ControlSet\001\Control\WindowsJIFControl\ to 0 to disable MMA access if not needed within the environment.
Adversary Use: Here is a publicly-available reference about FUZZYSNUGGLYDUCK using this technique: (www[.]awesomeThreatReports[.]org/FUZZYSNUGGLYDUCK_NOMS _ON_ROM_VIA_COM). Additionally, our red team uses this in our operations.
Additional References: Here is a reference from the researcher who discovered this technique: (www[.]crazySmartResearcher[.]net/POC_DETECTIONS_&_MITIGATIONS_4_WHEN_COM_RAMS_ROM)
Group & Software Example
Group Name: FUZZYSNUGGLYDUCK (www[.]sourceX[.]com)
Associated Groups: APT1337 (www[.]sourceY[.]com)
Description: FUZZYSNUGGLYDUCK is a Great Lakes-based threat group that has been active since at least May 2018. The group focuses on targeting the aviation sector. (www[.]sourceY[.]com)
Techniques:
- Spearphishing Attachment (T1193) – FUZZYSNUGGLYDUCK has used spearphishing email attachments containing images of stale bread to deliver malware. (www[.]sourceX[.]com)
- File and Directory Discovery (T1083) – FUZZYSNUGGLYDUCK has searched files and directories for the string *quack*. (www[.]sourceY[.]com)
Software Name: FLYINGV (www[.]sourceX[.]com) (wwwVsourceZ[.]com)
Group Association: FLYINGV has been used by FUZZYSNUGGLYDUCK. (www[.]sourceZ[.]com)
Description: FLYINGV is custom malware used by FUZZYSNUGGLYDUCK as a second-stage RAT. (www[.]sourceZ[.]com)
Platform: Windows
Techniques:
- Registry Run Keys / Start Folder (T1060) – FLYINGV has added the Registry Run key “HueyDeweyLouie” to establish persistence. (www[.]sourceX[.]com)
- File and Directory Discovery (T1083) – FLYINGV has used rundll32.exe to load its malicious dll file, estevez.dll. (www[.]sourceX[.]com)
Content Errors on the Website
If you find errors or typos on the site related to content, please let us know by sending an email to<EMAIL_ADDRESS>with the subject Website Content Error.
Please let us know the following:
- The url where you found the error.
- A short description of the error.
Examples of errors:
- Typos and syntax errors
- Improperly formatted web pages
- 404 errors when links are clicked
Contributors
The following individuals or organizations have contributed information regarding the existence of a technique, details on how to detect and/or mitigate use of a technique, or threat intelligence on adversary use:
- Alain Homewood, Insomnia Security
- Alan Neville, @abnev
- Anastasios Pingios
- Andrew Smith, @jakx_
- Barry Shteiman, Exabeam
- Bart Parys
- Bartosz Jerzman
- Bryan Lee
- Carlos Borges, CIP
- Casey Smith
- Christiaan Beek, @ChristiaanBeek
- Cody Thomas, SpecterOps
- Craig Aitchison
- Cybereason Nocturnus, @nocturnus
- Daniel Oakley
- Darren Spruell
- Dave Westgard
- David Ferguson, CyberSponse
- David Lu, Tripwire
- David Routin
- Ed Williams, Trustwave, SpiderLabs
- Edward Millington
- Elger Vinicius S. Rodrigues, @elgervinicius, CYBINT Centre
- Elia Florio, Microsoft
- Elly Searle, CrowdStrike — contributed to tactic definitions
- Emily Ratliff, IBM
- ENDGAME
- Eric Kuehn, Secure Ideas
- Erye Hernandez, Palo Alto Networks
- ESET
- Felipe Espósito, @Pr0teus
- FS-ISAC
- Hans Christoffer Gaardløs
- Itamar Mizrahi
- Itzik Kotler, SafeBreach
- Jacob Wilkin, Trustwave, SpiderLabs
- Jan Miller, CrowdStrike
- Jared Atkinson, @jaredcatkinson
- Jean-Ian Boutin, ESET
- Jeremy Galloway
- John Lambert, Microsoft Threat Intelligence Center
- John Strand
- Josh Abraham
- Justin Warner, ICEBRG
- Lab52 by S2 Grupo
- Leo Loobeek, @leoloobeek
- Loic Jaquemet
- Marc-Etienne M.Léveillé, ESET
- Mark Wee
- Martin Smolar, ESET
- Matt Graeber, @mattifestation, SpecterOps
- Matt Kelly, @breakersall
- Matthew Demaske, Adaptforward
- Matthew Molyett, @s1air
- McAfee
- Michael Cox
- Mike Kemmerer
- Milos Stojadinovic
- Mnemonic
- Nick Carr, FireEye
- Nik Seetharaman, Palantir
- Nishan Maharjan, @loki248
- Oddvar Moe, @oddvarmoe
- Oleg Skulkin, Group-IB
- Omkar Gudhate
- Patrick Campbell, @pjcampbe11
- Paul Speulstra, AECOM Global Security Operations Center
- Pedro Harrison
- Praetorian
- Rahmat Nurfauzi, @infosecn1nja, PT Xynexis International
- Red Canary
- RedHuntLabs (@redhuntlabs)
- Ricardo Dias
- Richard Gold, Digital Shadows
- Richie Cyrus, SpecterOps
- Robby Winchester, @robwinchester3
- Robert Falcone
- Romain Dumont, ESET
- Ryan Becwar
- Ryan Benson, Exabeam
- Scott Lundgren, @5twenty9, Carbon Black
- Stefan Kanthak
- Sudhanshu Chauhan, @Sudhanshu_C
- Sunny Neo
- Sylvain Gil, Exabeam
- Teodor Cimpoesu
- Tim MalcomVetter
- Tom Ueltschi @c_APT_ure
- Tony Lambert, Red Canary
- Travis Smith, Tripwire
- Tristan Bennett, Seamless Intelligence
- Valerii Marchuk, Cybersecurity Help s.r.o.
- Veeral Patel
- Vincent Le Toux
- Walker Johnson
- Ye Yint Min Thu Htut, Offensive Security Team, DBS Bank
- Yonatan Gotlib, Deep Instinct
Thanks to those who have contributed to ATT&CK!


You can list your side projects or open source libraries in this section. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum et ligula in nunc bibendum fringilla a eu lectus.
Citibank Korea Mobile Application - A responsible for developing the part that receives the transaction and marketing message received from Citibank and gives the push notification to the customer.


The following document contains the results of PMD 5.6.1.
Files
teetime/framework/AbstractStage.java
| Violation |
Line |
| Avoid empty if statements |
245–248 |
| These nested if statements could be combined |
343–345 |
| These nested if statements could be combined |
348–350 |
| These nested if statements could be combined |
488–492 |
| Useless parentheses. |
674 |
| Useless parentheses. |
734 |
teetime/framework/DivideAndConquerStage.java
| Violation |
Line |
| These nested if statements could be combined |
106–117 |
teetime/framework/Execution.java
| Violation |
Line |
| Avoid modifiers which are implied by the context |
48–50 |
teetime/framework/TeeTimeScheduler.java
| Violation |
Line |
| Avoid modifiers which are implied by the context |
27 |
| Avoid modifiers which are implied by the context |
29 |
| Avoid modifiers which are implied by the context |
34 |
| Avoid modifiers which are implied by the context |
39 |
| Avoid modifiers which are implied by the context |
44 |
| Avoid modifiers which are implied by the context |
49 |
teetime/framework/Traverser.java
| Violation |
Line |
| Avoid modifiers which are implied by the context |
32–34 |
| Avoid modifiers which are implied by the context |
36–38 |
| Avoid modifiers which are implied by the context |
37 |
| Violation |
Line |
| Avoid modifiers which are implied by the context |
142 |
| Violation |
Line |
| Avoid modifiers which are implied by the context |
20 |
teetime/framework/scheduling/globaltaskpool/GlobalTaskPoolScheduling.java
| Violation |
Line |
| Avoid unused private fields such as 'numOfExecutionsMask'. |
69 |
teetime/framework/scheduling/globaltaskpool/ITaskQueueDuplicable.java
| Violation |
Line |
| Avoid modifiers which are implied by the context |
24 |
| Violation |
Line |
| Avoid modifiers which are implied by the context |
24 |
teetime/framework/scheduling/globaltaskpool/ITaskQueueStage.java
| Violation |
Line |
| Avoid modifiers which are implied by the context |
22 |
| Violation |
Line |
| These nested if statements could be combined |
204–207 |
| Violation |
Line |
| Avoid modifiers which are implied by the context |
23 |
| Avoid modifiers which are implied by the context |
25 |
teetime/stage/basic/distributor/Distributor.java
| Violation |
Line |
| Overriding method merely calls super |
88–90 |
teetime/stage/basic/distributor/dynamic/DynamicDistributor.java
| Violation |
Line |
| Overriding method merely calls super |
70–72 |
teetime/stage/basic/distributor/strategy/CloneStrategy.java
| Violation |
Line |
| These nested if statements could be combined |
72–76 |
| These nested if statements could be combined |
73–75 |
| These nested if statements could be combined |
88–92 |
| These nested if statements could be combined |
89–91 |
| These nested if statements could be combined |
103–105 |
teetime/stage/basic/distributor/strategy/IDistributorStrategy.java
| Violation |
Line |
| Avoid modifiers which are implied by the context |
30 |
teetime/stage/basic/merger/Merger.java
| Violation |
Line |
| Overriding method merely calls super |
96–98 |
teetime/stage/basic/merger/dynamic/DynamicMerger.java
| Violation |
Line |
| Overriding method merely calls super |
63–65 |
teetime/stage/basic/merger/strategy/IMergerStrategy.java
| Violation |
Line |
| Avoid modifiers which are implied by the context |
29 |
teetime/stage/io/Printer.java
| Violation |
Line |
| Useless parentheses. |
128 |
| Useless parentheses. |
128 |
| Useless parentheses. |
128 |
teetime/stage/quicksort/PartitionStage.java
| Violation |
Line |
| Useless parentheses. |
37 |
| Useless parentheses. |
48 |
teetime/stage/taskfarm/ITaskFarmDuplicable.java
| Violation |
Line |
| Avoid modifiers which are implied by the context |
40 |
| Avoid modifiers which are implied by the context |
46 |
| Avoid modifiers which are implied by the context |
52 |
teetime/stage/taskfarm/monitoring/IMonitoringService.java
| Violation |
Line |
| Avoid modifiers which are implied by the context |
38 |
| Avoid modifiers which are implied by the context |
43 |
| Avoid modifiers which are implied by the context |
48 |
teetime/util/framework/concurrent/queue/PCBlockingQueue.java
| Violation |
Line |
| Useless parentheses. |
96 |
teetime/util/framework/list/CommittableResizableArrayQueue.java
| Violation |
Line |
| Unnecessary final modifier in final class |
39–42 |
| Unnecessary final modifier in final class |
105–109 |
| Unnecessary final modifier in final class |
111–116 |
| Unnecessary final modifier in final class |
118–120 |
| Unnecessary final modifier in final class |
122–124 |
teetime/util/framework/port/PortAction.java
| Violation |
Line |
| Avoid modifiers which are implied by the context |
22 |


◆ StoreOptionAction()
| option::Parser::StoreOptionAction::StoreOptionAction |
( |
Parser & |
parser_, |
|
|
Option |
options_[], |
|
|
Option |
buffer_[], |
|
|
int |
bufmax_ |
|
) |
| |
|
inline |
Number of slots in buffer
. -1
means "large enough".
Creates a new StoreOption action.
- Parameters
-
| parser_ | the parser whose op_count should be updated. |
| options_ | each Option o is chained into the linked list options_ [o.desc->index] |
| buffer_ | each Option is appended to this array as long as there's a free slot. |
| bufmax_ | number of slots in buffer_ . -1 means "large enough". |
◆ finished()
| bool option::Parser::StoreOptionAction::finished |
( |
int |
numargs, |
|
|
const char ** |
args |
|
) |
| |
|
inlinevirtual |
Called by Parser::workhorse() after finishing the parse.
- Parameters
-
| numargs | the number of non-option arguments remaining |
| args | pointer to the first remaining non-option argument (if numargs > 0). |
- Returns
false
iff a fatal error has occurred.
Reimplemented from option::Parser::Action.
◆ perform()
| bool option::Parser::StoreOptionAction::perform |
( |
Option & |
| ) |
|
|
inlinevirtual |
The documentation for this class was generated from the following file:


WordReferenceMovementMethod()
This class is a modified version of LinkMovementMethod that handles URL's of form wordRef://direction/number by invoking listener OnWordReferenceSelectedListener (if specified)


We examine content!
- incentivize killer ROI
- utilize value-added action-items
- aggregate 24/7 eyeballs
- monetize cutting-edge e-business
- enable best-of-breed vortals
- reintermediate dot-com mindshare
- harness synergistic bandwidth
- brand 24/365 partnerships
- enable distributed architectures
- embrace killer architectures
- empower end-to-end bandwidth
- leverage enterprise applications


Country Menu
Read Blog
Welcome, select a country to contribute to below
Starter Kit:
Click to view project
Nigeria:
Click to view project
Kenya:
Click to view project
Can't find your country? Click
here
to create it.


Dub
Main Menu
Edit Input
Enter Name
{{.Name}} {{.Surname}}
Just Some More Information. {{.Info}}
Copyright © Author
Profiler
. All Rights Reserved


Walker & Dunlop (WD) Investor Presentation - Slideshow
by SA Transcripts, https://seekingalpha.com/author/sa-transcriptsThe following slide deck was published by Walker & Dunlop, Inc. in conjunction with this event.
The following slide deck was published by Walker & Dunlop, Inc. in conjunction with this event.


DOCUMENTS
Resume/CV
Up-to-date resume containg a summery for my work and education
B.Sc. Degree English
B.Sc. Electrical Engineer Degree - English Translated
B.Sc. Degree Arabic
B.Sc. Electrical Engineer Degree - Arabic Translated
Exp. Letter
Software developer experience letter - Oriented Software (2014-2018)
Graduation Project
Documentation Documents for the B.Sc. senior graduation project.
UK Status Outcome
UK confirmation pre-settle status outcome.


Education
Fiction
Non-Fiction
Kid's Zone
Health
General
CHOOSE A COUPON
Coupon 1
Coupon 2
Coupon 3
Coupon 4
PAYMENT METHOD
credit card
credit card
credit card
NAME ON CARD
CARD NUMBER
CVV
MONTH
January
February
March
April
May
June
July
August
September
October
November
December
YEAR
2017
2018
2019
2020
2021
2022
2023
2024
2025
PLACE ORDER


@class @description Represents A Dependency
@constructor @param {string} alias
@description Resolves dependency, automatically invoked during parent resolution. @param {function} type


ACTIVATE_ONLY_FOR_THIS_NOTIFICATION
Send the notification even for disabled bot, but don't reactivate the bot for the user if it is disabled.


filter module¶
This module contains all methods to filter the data to visualization and calculation.
-
class
filter.
EStation
(station_name)[source]¶ Bases:
object
The class EStation contains all information of a EV charging station for future details display.
name: The street name plot: Occupancy over time figure rate: Parking rate table limit: Parking limit (in hour)
-
class
filter.
Street
(street_name)[source]¶ Bases:
object
The class Street contains all information of a on-street parking spot for future details display.
name: The street name plot: Occupancy over time figure rate: Parking rate table limit: Parking limit (in hour)
-
filter.
distance_df
(target_gis, street_geojson='/Users/ju/parkingadvisor/docs/AutoDoc/Documentation/Data_clean_up/data/Streets_gis.json')[source]¶ Calculates the distance from a given location to all streets
Parameters: - target_gis (list) – The given point coordinate (long, lat)
- street_geojson (str) – The GeoJSON file of all streets (i.e. Streets_gis.json)
Returns: a dataframe of distance of a given point to all streets
Return type: dataframe
-
filter.
ev_layer
(ev_gis='/Users/ju/parkingadvisor/docs/AutoDoc/Documentation/Data_clean_up/data/EV Charger.json')[source]¶ Read the EV charging stations datafile and convert into a GeoPandas.DataFrame
Parameters: ev_gis (str) – the JSON file constaining layer info Returns: a dataframe of the layer Return type: GeoPandas.DataFrame
-
filter.
flow_layer
(date_time, file_time='/Users/ju/parkingadvisor/docs/AutoDoc/Documentation/Data_clean_up/data/flow_all_streets.csv')[source]¶ Generate a dataframe of occupancy for all streets at a specific time point for folium map plot
Parameters: - date_time (datatime) – The start time of parking
- file_time (str) – The path of the raw file which containing all smoothed occupancy data (i.e. ‘flow_all_streets.csv’)
Returns: A dataframe containing occupancy at the time point
Return type: dataframe
-
filter.
link_to_gis
(df_properties, street_geojson='/Users/ju/parkingadvisor/docs/AutoDoc/Documentation/Data_clean_up/data/Streets_gis.json')[source]¶ Add GIS info to properties dataframe
Parameters: - df_properties (datatime) – the dataframe of properties
- street_geojson (str) – the JSON file constaining street info
Returns: a dataframe linked to gis
Return type: GeoPandas.DataFrame
-
filter.
plot_flow
(df_smooth_flow)[source]¶ Plot the flow figure for a single street
Parameters: df_smooth_flow (dataframe) – The smoothed flow data of a dingle street Returns: a figure containing the info of a dataframe Return type: matplotlib.pyplot.Figure
-
filter.
rate_layer
(date_time, file_rate='/Users/ju/parkingadvisor/docs/AutoDoc/Documentation/Data_clean_up/data/Rate_limit.csv')[source]¶ Generate a dataframe of parking rate for all streets at a specific datetime
Parameters: - date_time (datatime) – the start time of parking
- file_rate (str) – The entire rate file (i.e. ‘Rate_limit.csv’)
Returns: a dataframe containing all the info of the layer
Return type: dataframe
-
filter.
recomm_layer
(dest, date_time, factor=(0.3, 0.4, 0.3))[source]¶ Generates a dataframe with recommanded score for all streets
Parameters: - dest (tuple-like (lat,long)) – The destination coordinates
- date_time (datetime) – The start time point
- factor (list) – The score factor to calculate recommanded score
Returns: dataframe of recommanded scores
Return type: dataframe


title = "devicedelete" url = "/devicedelete" layout = "default" is_hidden = 0 ==
View existing devices here


Teens and young adults' mental health has been hit harder by Covid-19 than any other age group.
Teenagers have a lot of responsibilities. As well as stress passed on to teens from their parents, school, work, and relationships haven't gotten any easier to deal with. For everyone these days, but especially teens, it's important to make an effort to stay healthy, physically and mentally.
Back to home »Hawaii is rated second in the nation for symptoms of anxiety during the coronavirus pandemic. Every five days, the percentage of young adults (ages 18-29) experiencing symptoms of anxiety has trended upward, and is the highest of any age group. If we work together to help out this age group, we can stop this upward trend. The most important thing you can do is to keep a consistent daily routine, and develop healthy habits. Sleeping enough, and at the same hours every day, is essential to maintaining a good daily routine. You should also be eating three meals a day on a consistent schedule.
Back to home »


This view demonstrates interaction between the JavaScript loaded inside the view and Oxygen.
Have a look at the HTML rendered:
The plugin can use its Java-based API to add hooks on the workbench and call JavaScript function.Currently added hooks:
Events are sent from the Oxygen workbench to the JavaScript. Currently fired events:
Last received event:


I am currently attending Epicodus in Seattle.
Here are some of the projects that I created during my first week in Epicodus.
I am originally from Guam, but moved to Seattle to attend college at the University of Washington.
I enjoy gardening, watching movies, and taking family vacations to the San Juan Islands, Hawaii, and of course, Guam!
In my spare time, I like to bead and sew. I have made beaded jewelry and Christmas ornaments for family and friends. My favorite sewing projects are slipcovers, pillow covers, and oven mitts.


Work Day Scheduler
A simple calendar app for scheduling your work day
CURRENT DATE
9 AM
10 AM
11 AM
12 AM
1 PM
2 PM
3 PM
4 PM
5 PM


Converting equirectangular and cubemap image to perspective view image¶
A perspective image is usually considered with a 90 ° field of view but the code supports other values of FOV in the horizontal and vertical direction. One of the most common applications of this type of conversion is to create a 360 ° image/video viewer, we can also use this method to generate multiple novel pinhole camera images from a single 360 ° image. This is also useful when generating a VR experience or game using skyboxes.
A simplified version of the math behind such conversions is explained in the following figure, to know more mathematical details refer to [1].
Python Example¶
Example code for equirectangular to perspective conversion¶
-
fisheyeUtils.
eqruirect2persp
(img, FOV, Theta, Phi, Hd, Wd)¶ - Parameters
img – input cubemap image
FOV – field of view (in horizontal direction)
Theta – Viewing angle wrt z axis
Phi – VIewing angle wrt y axis
Hd – Output image height
Wd – Output image width
#!/usr/bin/env/python
import cv2
import numpy as np
import math
import time
import sys
from omnicv import fisheyeImgConv
# path to the input equirectangular image
Img_path = sys.argv[1]
equiRect = cv2.imread(Img_path)
cv2.namedWindow("cubemap",cv2.WINDOW_NORMAL)
cv2.imshow("cubemap",equiRect)
cv2.waitKey(0)
outShape = [400,400]
inShape = equiRect.shape[:2]
mapper = fisheyeImgConv()
FOV = 90
Theta = 0
Phi = 0
Hd = outShape[0]
Wd = outShape[1]
persp = mapper.eqruirect2persp(equiRect,FOV,Theta,Phi,Hd,Wd)
cv2.imshow("cubemap",persp)
cv2.waitKey(0)
Example code for cubemap to perspective conversion¶
-
fisheyeImgConv.
cubemap2persp
(self, img, FOV, Theta, Phi, Hd, Wd)¶ - Parameters
img – Input equirectangular image
FOV – Field of view (in horizontal direction)
Theta – Viewing angle wrt z axis
Phi – Viewing angle wrt y axis
Hd – Output image height
Wd – Output image width
#!/usr/bin/env/python
import cv2
import numpy as np
import math
import time
import sys
from omnicv import fisheyeImgConv
Img_path = sys.argv[1]
equiRect = cv2.imread(Img_path)
cv2.namedWindow("cubemap",cv2.WINDOW_NORMAL)
cv2.imshow("cubemap",equiRect)
cv2.waitKey(0)
outShape = [400,400]
inShape = equiRect.shape[:2]
mapper = fisheyeImgConv()
FOV = 90
Theta = 0
Phi = 0
Hd = outShape[0]
Wd = outShape[1]
persp = mapper.cubemap2persp(equiRect,FOV,Theta,Phi,Hd,Wd)
cv2.imshow("cubemap",persp)
cv2.waitKey(0)
C++ Example¶
Example code for equirectangular to perspective conversion¶
-
fisheyeImgConv::equirect2persp(const cv::Mat &img, cv::Mat &dstFrame,float FOV,
-
float THETA, float PHI, int Hd, int Wd);
- Parameters
img – input cubemap image
FOV – field of view (in horizontal direction)
THETA – Viewing angle wrt z axis
PHI – VIewing angle wrt y axis
Hd – Output image height
Wd – Output image width
dstFrame – Output images
#include<iostream>
#include<opencv2/opencv.hpp>
#include"../omnicv/utils.hpp"
#include <opencv2/core/core.hpp>
// Creating the display window
int H = 500;
int W = 500;
std::string WINDOW_NAME{"viewer"};
int main()
{
cv::namedWindow(WINDOW_NAME,CV_WINDOW_NORMAL);
cv::Mat frame;
cv::Mat outFrame;
frame = cv::imread("../data/equirect_temp1.jpg");
cv::imshow(WINDOW_NAME,frame);
cv::waitKey(0);
fisheyeImgConv mapper1;
mapper1.equirect2persp(frame,outFrame,90,120,45, 400,400);
return 0;
}
Example code for cubemap to perspective conversion¶
-
fisheyeImgConv::cubemap2persp(const cv::Mat &img1, cv::Mat &dstFrame,float FOV,
-
float THETA, float PHI, int Hd, int Wd);
- Parameters
img – Input equirectangular image
FOV – Field of view (in horizontal direction)
Theta – Viewing angle wrt z axis
Phi – Viewing angle wrt y axis
Hd – Output image height
Wd – Output image width
dstFrame – Output image
#include<iostream>
#include<opencv2/opencv.hpp>
#include"../omnicv/utils.hpp"
#include <opencv2/core/core.hpp>
// Creating the display window
int H = 500;
int W = 500;
std::string WINDOW_NAME{"viewer"};
int main()
{
cv::namedWindow(WINDOW_NAME,CV_WINDOW_NORMAL);
// cv::resizeWindow(WINDOW_NAME, 400, 400);
cv::Mat frame;
cv::Mat outFrame;
frame = cv::imread("../data/cubemap_dice.jpg");
cv::imshow(WINDOW_NAME,frame);
cv::waitKey(0);
fisheyeImgConv mapper1;
mapper1.cubemap2persp(frame,outFrame,90,120,45, 400,400);
return 0;
}
For a more detailed example refer to the following code. for equirectangular to cubemap projection and refer this code.
Equirectangular to perspective image |
Cubemap to perspective image |
|---|---|
Reference¶
[1] Araújo, António. (2018). Drawing Equirectangular VR Panoramas with Ruler, Compass, and Protractor. Journal of Science and Technology of the Arts. 10. 10.7559/citarj.v10i1.471.