Related
I'm cropping teeth section (mouth) from face based on x,y co-ordinates received from AWS recognition face API
this code is working and cropping the teeth section like
but I need only teeth section to be cropped.
AWS recognition API image response
[
{
"BoundingBox": {
"Width": 0.4604368805885315,
"Height": 0.7760819792747498,
"Left": 0.28602713346481323,
"Top": 0.07381705939769745
},
"AgeRange": {
"Low": 48,
"High": 66
},
"Smile": {
"Value": true,
"Confidence": 99.91497802734375
},
"Eyeglasses": {
"Value": false,
"Confidence": 98.94174194335938
},
"Sunglasses": {
"Value": false,
"Confidence": 99.84471130371094
},
"Gender": {
"Value": "Male",
"Confidence": 99.57334899902344
},
"Beard": {
"Value": false,
"Confidence": 73.63420867919922
},
"Mustache": {
"Value": false,
"Confidence": 96.08769226074219
},
"EyesOpen": {
"Value": true,
"Confidence": 98.94685363769531
},
"MouthOpen": {
"Value": true,
"Confidence": 99.7721939086914
},
"Emotions": [
{
"Type": "HAPPY",
"Confidence": 99.75701904296875
},
{
"Type": "SURPRISED",
"Confidence": 0.10713297128677368
},
{
"Type": "CONFUSED",
"Confidence": 0.056786004453897476
},
{
"Type": "CALM",
"Confidence": 0.02734198607504368
},
{
"Type": "ANGRY",
"Confidence": 0.020567195490002632
},
{
"Type": "DISGUSTED",
"Confidence": 0.01198340579867363
},
{
"Type": "SAD",
"Confidence": 0.011844608001410961
},
{
"Type": "FEAR",
"Confidence": 0.007329543586820364
}
],
"Landmarks": [
{
"Type": "eyeLeft",
"X": 0.4020455777645111,
"Y": 0.3627050220966339
},
{
"Type": "eyeRight",
"X": 0.6262026429176331,
"Y": 0.379489928483963
},
{
"Type": "mouthLeft",
"X": 0.40419745445251465,
"Y": 0.6104526519775391
},
{
"Type": "mouthRight",
"X": 0.5907381772994995,
"Y": 0.6247860193252563
},
{
"Type": "nose",
"X": 0.49532997608184814,
"Y": 0.48828810453414917
},
{
"Type": "leftEyeBrowLeft",
"X": 0.32399997115135193,
"Y": 0.3045051097869873
},
{
"Type": "leftEyeBrowRight",
"X": 0.38662829995155334,
"Y": 0.27300384640693665
},
{
"Type": "leftEyeBrowUp",
"X": 0.4492948651313782,
"Y": 0.2880849540233612
},
{
"Type": "rightEyeBrowLeft",
"X": 0.578127920627594,
"Y": 0.29742100834846497
},
{
"Type": "rightEyeBrowRight",
"X": 0.6459962725639343,
"Y": 0.29183030128479004
},
{
"Type": "rightEyeBrowUp",
"X": 0.7144292593002319,
"Y": 0.3330812454223633
},
{
"Type": "leftEyeLeft",
"X": 0.3629233241081238,
"Y": 0.3603385388851166
},
{
"Type": "leftEyeRight",
"X": 0.4457237124443054,
"Y": 0.36826738715171814
},
{
"Type": "leftEyeUp",
"X": 0.4013364613056183,
"Y": 0.3494759500026703
},
{
"Type": "leftEyeDown",
"X": 0.40179359912872314,
"Y": 0.37347349524497986
},
{
"Type": "rightEyeLeft",
"X": 0.5811655521392822,
"Y": 0.3783351182937622
},
{
"Type": "rightEyeRight",
"X": 0.6668664813041687,
"Y": 0.38298410177230835
},
{
"Type": "rightEyeUp",
"X": 0.6265660524368286,
"Y": 0.36624279618263245
},
{
"Type": "rightEyeDown",
"X": 0.6238686442375183,
"Y": 0.39007559418678284
},
{
"Type": "noseLeft",
"X": 0.4562915861606598,
"Y": 0.5203639268875122
},
{
"Type": "noseRight",
"X": 0.5394821166992188,
"Y": 0.5265129804611206
},
{
"Type": "mouthUp",
"X": 0.4932428300380707,
"Y": 0.5806143283843994
},
{
"Type": "mouthDown",
"X": 0.48947831988334656,
"Y": 0.6564671397209167
},
{
"Type": "leftPupil",
"X": 0.4020455777645111,
"Y": 0.3627050220966339
},
{
"Type": "rightPupil",
"X": 0.6262026429176331,
"Y": 0.379489928483963
},
{
"Type": "upperJawlineLeft",
"X": 0.28082960844039917,
"Y": 0.37847602367401123
},
{
"Type": "midJawlineLeft",
"X": 0.3077985942363739,
"Y": 0.6443988680839539
},
{
"Type": "chinBottom",
"X": 0.48529136180877686,
"Y": 0.7894702553749084
},
{
"Type": "midJawlineRight",
"X": 0.7061411738395691,
"Y": 0.6732134819030762
},
{
"Type": "upperJawlineRight",
"X": 0.77140212059021,
"Y": 0.4138971269130707
}
],
"Pose": {
"Roll": 3.0064163208007812,
"Yaw": -2.569990634918213,
"Pitch": 8.883845329284668
},
"Quality": {
"Brightness": 76.55046844482422,
"Sharpness": 94.08262634277344
},
"Confidence": 99.99818420410156
}
]
Node Js code for crop using gm ImageMagick library
const init = async () => {
try {
console.info("Process Started");
const size = await getImageSize("passport-photo.jpeg");
console.info("get Image Size: ", size);
const faceDetails = await getFaceDetailsFromImage();
// Uploded image width height
const imageWidth = size.width;
const imageHeight = size.height;
// Face detail width height
const faceDetailWidth = Math.round(faceDetails[0].BoundingBox.Width * imageWidth);
const faceDetailHeight = Math.round(faceDetails[0].BoundingBox.Height * imageHeight);
// Coordinates for the mouth
const faceDetailMouthLeft = faceDetails[0].Landmarks.filter(o => o.Type === "mouthLeft");
const faceDetailMouthRight = faceDetails[0].Landmarks.filter(o => o.Type === "mouthRight");
const faceDetailMouthUp = faceDetails[0].Landmarks.filter(o => o.Type === "mouthUp");
const faceDetailMouthDown = faceDetails[0].Landmarks.filter(o => o.Type === "mouthDown");
// Find x and y point from where the cropping needs to be started
const xPoint = Math.round(faceDetailMouthLeft[0].X * imageWidth);
const yPoint = Math.round(faceDetailMouthUp[0].Y * imageHeight);
// Width height for which image needs to be cut from start index
const width = ((faceDetailMouthRight[0].X - faceDetailMouthLeft[0].X) * imageWidth)
const height = ((faceDetailMouthDown[0].Y - faceDetailMouthUp[0].Y) * imageHeight)
console.log("xPoint:" + xPoint + ", yPoint:" + yPoint + ", faceDetailWidth:" + faceDetailWidth + ", faceDetailHeight:" + faceDetailHeight)
gm('passport-photo.jpeg')
// Invoke crop function
.crop(width, height, xPoint, yPoint, true)
// Process and Write the image
.write("crop5.png", function (err) {
console.error(err);
if (!err) console.log('done');
});
} catch (error){
console.error(error);
}
}
init();
original image
Your calculations for the mouth co-ordinates appear to be correct.
However, I see you are using:
.crop(width, height, xPoint, yPoint, true)
As you say, this "accepts the parameter as a percentage value", which probably isn't what you want.
I have the JSON like
var resultJSON = `{
"data": {
"total": 1,
"list_name": "title",
"title": {
"id": 53,
"name": "Sonu",
"mobileNo": "6543213456",
"address": "Greeny Pathway",
"city": "NewYork",
"mode": "Weekly",
"duration": "15",
"qty": null
},
"download": [{
"time": "16789042",
"date": "26 - 01 - 2020"
}]
}
}`;
I expect the output:
{
"total": "1",
"list_name": "title",
"name": "sonu",
"mobileno": "6543213456"
}
Here "list_name": "title" is dynamic, sometimes it will come "list_name": "book", based on that above mentioned response I want to get.
Something like this? I had to fix your invalid JSON
You can make it more clever if you study https://javascript.info/destructuring-assignment in depth
const resultJSON = `{
"data": {
"total": 1,
"list_name": "title",
"title": {
"id": 53,
"name": "Sonu",
"mobileNo": "6543213456",
"address": "Greeny Pathway",
"city": "NewYork",
"mode": "Weekly",
"duration": "15",
"qty": null
},
"download": [{
"time": "16789042",
"date": "26-01-2020"
}]
}
}`
const data = JSON.parse(resultJSON).data
const content = data[data.list_name];
let newObj = {}
newObj["total"] = data["total"];
newObj["list_name"] = data["list_name"];
newObj["name"] = content["name"];
newObj["mobileNo"] = content["mobileNo"];
console.log(newObj)
I have several same keys and multiple values I just want to parse JSON with keys and values and extract device_id, As you can see all device_id is the same but the value of them is different.
How can I parse.json and have just device_id: values?
My file is like this :
[
{
"id": "c19ca393.e14b1",
"type": "tab",
"label": "Flow 1",
"disabled": false,
"info": ""
},
{
"id": "a15871bb.7c3b2",
"type": "input-distributer",
"z": "c19ca393.e14b1",
"name": "input-distributer",
"device_id": "93e71ba7-fb56-5592-a5f6-d855203dd7ae",
"device_name": "nmos-cpp_node_10-20-130-24:6131",
"x": 280,
"y": 260,
"wires": [
[
"6548d2cb.45bc1c"
],
[
"7cf8bc7e.204a84"
]
]
},
{
"id": "421da76b.670be8",
"type": "output-distributer",
"z": "c19ca393.e14b1",
"name": "output-distributer",
"device_id": "93e71ba7-fb56-5592-a5f6-d855203dd7ae",
"device_name": "nmos-cpp_node_10-20-130-24:6131",
"x": 620,
"y": 260,
"wires": [
]
},
{
"id": "6548d2cb.45bc1c",
"type": "video-switcher",
"z": "c19ca393.e14b1",
"name": "video-switcher",
"device_id": "93e71ba7-fb56-5592-a5f6-d855203dd7ae",
"device_name": "nmos-cpp_node_10-20-130-24:6131",
"x": 480,
"y": 120,
"wires": [
[
"421da76b.670be8"
]
]
},
{
"id": "7cf8bc7e.204a84",
"type": "audio-switcher",
"z": "c19ca393.e14b1",
"name": "audio-switcher",
"device_id": "fe21abdf-706f-5c7b-adb8-2507e145e820",
"device_name": "nmos-cpp_node_10-20-130-24:6121",
"x": 440,
"y": 360,
"wires": [
[
"421da76b.670be8"
]
]
}
]
If I wanted to grab all the values of the device id, How is it possible?
You can try this for getting device_id values
data.map(element => { // data refers to your array
console.log(element['device_id']);
});
since in first object device_id is not there so it will print undefined and you can apply a check on that.
You can add a check if device_id exists or not and the you can .map it.
Try this:
let arr = [{"id":"c19ca393.e14b1","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"a15871bb.7c3b2","type":"input-distributer","z":"c19ca393.e14b1","name":"input-distributer","device_id":"93e71ba7-fb56-5592-a5f6-d855203dd7ae","device_name":"nmos-cpp_node_10-20-130-24:6131","audio_services":"{\"node-input-audio_services1\":\"c250498b-52ee-5162-b450-e15905912e8c\",\"audio_ip_1\":\"1.2.3.4\",\"audio_port_1\":\"1234\"}","video_services":"{\"node-input-video_services1\":\"c250498b-52ee-5162-b450-e15905912e8c\",\"video_ip_1\":\"5.6.7.8\",\"video_port_1\":\"5678\"}","x":280,"y":260,"wires":[["6548d2cb.45bc1c"],["7cf8bc7e.204a84"]]},{"id":"421da76b.670be8","type":"output-distributer","z":"c19ca393.e14b1","name":"output-distributer","device_id":"93e71ba7-fb56-5592-a5f6-d855203dd7ae","device_name":"nmos-cpp_node_10-20-130-24:6131","audio_services":"{\"node-input-audio_services1\":\"7d010b65-b9d8-5561-a622-189b1c06d3f9\"}","video_services":"{\"node-input-video_services1\":\"7d010b65-b9d8-5561-a622-189b1c06d3f9\"}","x":620,"y":260,"wires":[]},{"id":"6548d2cb.45bc1c","type":"video-switcher","z":"c19ca393.e14b1","name":"video-switcher","device_id":"93e71ba7-fb56-5592-a5f6-d855203dd7ae","device_name":"nmos-cpp_node_10-20-130-24:6131","video_senders":"{\"node-input-senders_services1\":\"c250498b-52ee-5162-b450-e15905912e8c\",\"senders_ip_1\":\"9.0.1.2\",\"senders_port_1\":\"9012\"}","video_receivers":"{\"node-input-receivers_services1\":\"7d010b65-b9d8-5561-a622-189b1c06d3f9\"}","x":480,"y":120,"wires":[["421da76b.670be8"]]},{"id":"7cf8bc7e.204a84","type":"audio-switcher","z":"c19ca393.e14b1","name":"audio-switcher","device_id":"fe21abdf-706f-5c7b-adb8-2507e145e820","device_name":"nmos-cpp_node_10-20-130-24:6121","audio_senders":"{\"node-input-senders_services1\":\"7408e1be-a227-5d0a-a22b-294bcf22017c\",\"senders_ip_1\":\"0.0.0.0\",\"senders_port_1\":\"0000\"}","audio_receivers":"{\"node-input-receivers_services1\":\"d08f3a50-41fc-5020-9c6c-175d91891aef\"}","x":440,"y":360,"wires":[["421da76b.670be8"]]}]
let device_ids = arr.filter(o => o.device_id).map(obj => obj.device_id);
console.log(device_ids);
After you opened the file and get the data from it, iterate through array and check if object has property device_id obj.hasOwnProperty("device_id") , if it's present, print it:
// edit after comment ---------
async function getFileContent() {
fs.readFile("flow_demo_1.json", (err, data) => {
if (err) {
console.log(err);
} else {
console.log(data.toString());
return data
}
})
}
// const fileContent = await getFileContent();
// const myObj = JSON.parse(fileContent)
// ---------
const myObj = [{
"id": "c19ca393.e14b1",
"type": "tab",
"label": "Flow 1",
"disabled": false,
"info": ""
},
{
"id": "a15871bb.7c3b2",
"type": "input-distributer",
"z": "c19ca393.e14b1",
"name": "input-distributer",
"device_id": "93e71ba7-fb56-5592-a5f6-d855203dd7ae",
"device_name": "nmos-cpp_node_10-20-130-24:6131",
"audio_services": "{\"node-input-audio_services1\":\"c250498b-52ee-5162-b450-e15905912e8c\",\"audio_ip_1\":\"1.2.3.4\",\"audio_port_1\":\"1234\"}",
"video_services": "{\"node-input-video_services1\":\"c250498b-52ee-5162-b450-e15905912e8c\",\"video_ip_1\":\"5.6.7.8\",\"video_port_1\":\"5678\"}",
"x": 280,
"y": 260,
"wires": [
[
"6548d2cb.45bc1c"
],
[
"7cf8bc7e.204a84"
]
]
},
{
"id": "421da76b.670be8",
"type": "output-distributer",
"z": "c19ca393.e14b1",
"name": "output-distributer",
"device_id": "93e71ba7-fb56-5592-a5f6-d855203dd7ae",
"device_name": "nmos-cpp_node_10-20-130-24:6131",
"audio_services": "{\"node-input-audio_services1\":\"7d010b65-b9d8-5561-a622-189b1c06d3f9\"}",
"video_services": "{\"node-input-video_services1\":\"7d010b65-b9d8-5561-a622-189b1c06d3f9\"}",
"x": 620,
"y": 260,
"wires": [
]
},
{
"id": "6548d2cb.45bc1c",
"type": "video-switcher",
"z": "c19ca393.e14b1",
"name": "video-switcher",
"device_id": "93e71ba7-fb56-5592-a5f6-d855203dd7ae",
"device_name": "nmos-cpp_node_10-20-130-24:6131",
"video_senders": "{\"node-input-senders_services1\":\"c250498b-52ee-5162-b450-e15905912e8c\",\"senders_ip_1\":\"9.0.1.2\",\"senders_port_1\":\"9012\"}",
"video_receivers": "{\"node-input-receivers_services1\":\"7d010b65-b9d8-5561-a622-189b1c06d3f9\"}",
"x": 480,
"y": 120,
"wires": [
[
"421da76b.670be8"
]
]
},
{
"id": "7cf8bc7e.204a84",
"type": "audio-switcher",
"z": "c19ca393.e14b1",
"name": "audio-switcher",
"device_id": "fe21abdf-706f-5c7b-adb8-2507e145e820",
"device_name": "nmos-cpp_node_10-20-130-24:6121",
"audio_senders": "{\"node-input-senders_services1\":\"7408e1be-a227-5d0a-a22b-294bcf22017c\",\"senders_ip_1\":\"0.0.0.0\",\"senders_port_1\":\"0000\"}",
"audio_receivers": "{\"node-input-receivers_services1\":\"d08f3a50-41fc-5020-9c6c-175d91891aef\"}",
"x": 440,
"y": 360,
"wires": [
[
"421da76b.670be8"
]
]
}
]
for (let obj of myObj) {
if (obj.hasOwnProperty("device_id")) {
console.log("device_id: " + obj.device_id)
}
}
finally found my answer :
var fileContent = fs.readFileSync('flow_demo_1.json', 'utf8');
console.log(fileContent);
const myObj = JSON.parse(fileContent)
for (let obj of myObj) {
if (obj.hasOwnProperty("device_id")) {
console.log("device_id: " + obj.device_id);
}
}
Thanks every one.
From this array:
[{
"map": {
"name": "2",
"y": 2
}
}, {
"map": {
"name": "4",
"y": 17494
}
}, {
"map": {
"name": "3",
"y": 2
}
}, {
"map": {
"name": "1",
"y": 1
}
}]
I want this data structure:
[{
"name": "2",
"y": 2
}, {
"name": "4",
"y": 17494
}, {
"name": "3",
"y": 2
}, {
"name": "1",
"y": 1
}]
How can I do this?
Use JavaScript mapping:
let json = [{
"map": {
"name": "2",
"y": 2
}
}, {
"map": {
"name": "4",
"y": 17494
}
}, {
"map": {
"name": "3",
"y": 2
}
}, {
"map": {
"name": "1",
"y": 1
}
}];
let result = json.map(item => item.map);
result.forEach(i => console.log(i));
Above code prints:
{name: "2", y: 2}
{name: "4", y: 17494}
{name: "3", y: 2}
{name: "1", y: 1}
See:
Array.map
Use Array.prototype.reduce()
let input=[{
"map": {
"name": "2",
"y": 2
}
}, {
"map": {
"name": "4",
"y": 17494
}
}, {
"map": {
"name": "3",
"y": 2
}
}, {
"map": {
"name": "1",
"y": 1
}
}]
let revisedarray=input.reduce((acc,val)=>{
acc.push(val.map);
return acc;
},[])
console.log(revisedarray)
For more info about array reduce you can look at-mdn docs
Hi you can do this via pure js by looping through the array and extracting out the required output. Please check the code below.
var arr = [{ "map": { "name": "2", "y": 2 } }, { "map": { "name": "4", "y": 17494 } }, { "map": { "name": "3", "y": 2 } }, { "map": { "name": "1", "y": 1 } }];
var resultArr = arr.map(function(item) {
return item.map;
})
ES6 Short syntax, here A is original array of objects and A2 is output array of objects
let A2 = A.map(o=>o.map);
let jsonString = your_jsonString;
var blankArr = [];
let result = jsonString.map(item => item.map);
result.forEach(i => blankArr.push(i));
console.log(blankArr);
Below is my json stored in :
$scope.regions = [];
{
"id": 100,
"regions": [
{
"id": 10,
"name": "Abc",
"rank": 0,
},
{
"id": 20,
"name": "Pqr",
"rank": 1,
},
{
"id": 30,
"name": "Lmn",
"rank": 2,
},
{
"id": 40,
"name": "xyz",
"rank": 3,
},
{
"id": 50,
"name": "GGG",
"rank": 4,
},
{
"id": 60,
"name": "YYY",
"rank": 5,
}
]
}
This is my another json stored in :
$scope.regionList = [];
var highestOrder = 3;
"regions": [
{
"id": 40,
"name": "xyz",
"rank": 0,
},
{
"id": 50,
"name": "GGG",
"rank": 1,
},
{
"id": 60,
"name": "YYY",
"rank": 2,
}
Now I want to merge $scope.regionList in to $scope.regions but for those records which are matching in both $scope.regionList and $scope.regions I would like to replace records of $scope.regions with $scope.regionList (only common records from both list).
And first non matching records from $scope.regionList will have order start using highestOrder and will keep incrementing for each non-matching records so final output will be like below :
Expected output :
"regions": [
{
"id": 10,
"name": "Abc",
"rank": 3,
},
{
"id": 20,
"name": "Pqr",
"rank": 4,
},
{
"id": 30,
"name": "Lmn",
"rank": 5,
},
{
"id": 40,
"name": "xyz",
"rank": 0,
},
{
"id": 50,
"name": "GGG",
"rank": 1,
},
{
"id": 60,
"name": "YYY",
"rank": 2,
}
As Abc is is the first non matching record so it will have order 3 and rest other will have order no from 3 i.e 4,5 6, etc.
My code:
var highestOrder = 3;
var found = false;
for (var i = 0; i < $scope.regions.length; i++) {
if ($scope.regions[i].id == 100) {
found = true;
for (var j = 0; j < $scope.regionList.length; j++) {
for (var k = 0; k < $scope.regions[i].regions.length; k++) {
if ($scope.regions[i].regions[k].id == $scope.regionList[j].id) {
$scope.regions[i].regions[k].rank = $scope.regionList[j].rank;
}
else {
$scope.regions[i].regions[k].rank = highestOrder;
highestOrder = highestOrder + 1;
}
}
}
}
if (found)
break;
}
var regions = {
"id": 100,
"regions": [{
"id": 10,
"name": "Abc",
"rank": 0,
},
{
"id": 20,
"name": "Pqr",
"rank": 1,
},
{
"id": 30,
"name": "Lmn",
"rank": 2,
},
{
"id": 40,
"name": "xyz",
"rank": 3,
},
{
"id": 50,
"name": "GGG",
"rank": 4,
},
{
"id": 60,
"name": "YYY",
"rank": 5,
}
]
}
var highestOrder = 3;
var found = false;
var regionList = [{
"id": 40,
"name": "xyz",
"rank": 0,
},
{
"id": 50,
"name": "GGG",
"rank": 1,
},
{
"id": 60,
"name": "YYY",
"rank": 2
}
]
for (var i = 0; i < regions.length; i++) {
if (regions[i].id == 100) {
found = true;
for (var j = 0; j < regionList.length; j++) {
for (var k = 0; k < regions[i].regions.length; k++) {
if (regions[i].regions[k].id == regionList[j].id) {
regions[i].regions[k].rank = regionList[j].rank;
} else {
regions[i].regions[k].rank = highestOrder;
highestOrder = highestOrder + 1;
}
}
}
}
if (found)
break;
}
console.log(regions)
You could use a hash table and build it with the elements of the array for updating.
Then iterate regions and update rank with either the hash's rank or with highestOrder. Increment highestOrder after assigning.
var $scope = { regions: [{ id: 100, regions: [{ id: 10, name: "Abc", rank: 0, }, { id: 20, name: "Pqr", rank: 1, }, { id: 30, name: "Lmn", rank: 2, }, { id: 40, name: "xyz", rank: 3, }, { id: 50, name: "GGG", rank: 4, }, { id: 60, name: "YYY", rank: 5, }] }] },
regionsUpdate = [{ id: 40, name: "xyz", rank: 0, }, { id: 50, name: "GGG", rank: 1, }, { id: 60, name: "YYY", rank: 2, }],
regionsId = 100,
highestOrder = 3,
hash = Object.create(null);
regionsUpdate.forEach(function (a) {
hash[a.id] = a;
});
$scope.regions.some(function (a) {
if (a.id === regionsId) {
a.regions.forEach(function (b) {
b.rank = hash[b.id] ? hash[b.id].rank : highestOrder++;
});
return true;
}
});
console.log($scope);
.as-console-wrapper { max-height: 100% !important; top: 0; }