# Detects colors in images up to 10 x faster than Numpy
### pip install locate-pixelcolor-cpp-parallelfor
#### Tested against Windows 10 / Python 3.10 / Anaconda
### Important!
The module imports a function from a compiled .dll (C++).
If you get any import errors, install: https://download.visualstudio.microsoft.com/download/pr/8b92f460-7e03-4c75-a139-e264a770758d/26C2C72FBA6438F5E29AF8EBC4826A1E424581B3C446F8C735361F1DB7BEFF72/VC_redist.x64.exe
### How to use it in Python
```python
import cv2
import numpy as np
from locate_pixelcolor_cpp_parallelfor import search_colors
# 4525 x 6623 x 3 picture https://www.pexels.com/pt-br/foto/foto-da-raposa-sentada-no-chao-2295744/
picx = r"C:\Users\hansc\Downloads\pexels-alex-andrews-2295744.jpg"
pic = cv2.imread(picx)
colors0 = np.array([[255, 255, 255]],dtype=np.uint8)
resus0 = search_colors(pic=pic, colors=colors0, cpus=5)
colors1=np.array([(66, 71, 69),(62, 67, 65),(144, 155, 153),(52, 57, 55),(127, 138, 136),(53, 58, 56),(51, 56, 54),(32, 27, 18),(24, 17, 8),],dtype=np.uint8)
resus1 = search_colors(pic=pic, colors=colors1, cpus=4)
print(resus1)
####################################################################
# Pretty good, but this one is better: https://github.com/hansalemaos/locate_pixelcolor_cpppragma
%timeit resus0 = search_colors(pic=pic, colors=colors0, cpus=5)
69.4 ms ± 302 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
b,g,r = pic[...,0],pic[...,1],pic[...,2]
%timeit np.where(((b==255)&(g==255)&(r==255)))
150 ms ± 209 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
####################################################################
%timeit resus1 = search_colors(pic=pic, colors=colors1, cpus=5)
151 ms ± 10.2 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
%timeit np.where(((b==66)&(g==71)&(r==69))|((b==62)&(g==67)&(r==65))|((b==144)&(g==155)&(r==153))|((b==52)&(g==57)&(r==55))|((b==127)&(g==138)&(r==136))|((b==53)&(g==58)&(r==56))|((b==51)&(g==56)&(r==54))|((b==32)&(g==27)&(r==18))|((b==24)&(g==17)&(r==8)))
1 s ± 16.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
####################################################################
```
### The C++ Code
```cpp
#include <atomic>
#include <ppl.h>
std::atomic<int> value(0);
int create_id()
{
return std::atomic_fetch_add(&value, 1);
}
extern "C" __declspec(dllexport) void colorsearch(char *pic, char *colors, int width, int totallengthpic, int totallengthcolor, int *outputx, int *outputy, int *lastresult)
{
value = 0;
concurrency::parallel_for(0, totallengthcolor / 3 + 1, [&](int i)
{
int r = i * 3;
int g = i * 3 + 1;
int b = i * 3 + 2;
for (int j = 0; j <= totallengthpic; j += 3)
{
if ((colors[r] == pic[j]) && (colors[g] == pic[j + 1]) && (colors[b] == pic[j + 2]))
{
int dividend = j / 3;
int quotient = dividend / width;
int remainder = dividend % width;
int upcounter = create_id();
outputx[upcounter] = quotient;
outputy[upcounter] = remainder;
lastresult[0] = upcounter;
}
} });
}
// cl.exe /std:c++20 /fp:fast /EHsc /Oi /Ot /Oy /Ob3 /GF /Gy /MD /openmp /LD cloop.cpp /Fe:cloop.dll
```
Raw data
{
"_id": null,
"home_page": "https://github.com/hansalemaos/locate_pixelcolor_cpp_parallelfor",
"name": "locate-pixelcolor-cpp-parallelfor",
"maintainer": "",
"docs_url": null,
"requires_python": "",
"maintainer_email": "",
"keywords": "cpp,c++,image,search,parallel,rgb",
"author": "Johannes Fischer",
"author_email": "aulasparticularesdealemaosp@gmail.com",
"download_url": "https://files.pythonhosted.org/packages/a0/c0/7c09798dc957a2e762777162e485a58b83192948ad2e72e6f59887703335/locate_pixelcolor_cpp_parallelfor-0.11.tar.gz",
"platform": null,
"description": "# Detects colors in images up to 10 x faster than Numpy \r\n\r\n### pip install locate-pixelcolor-cpp-parallelfor\r\n\r\n#### Tested against Windows 10 / Python 3.10 / Anaconda\r\n\r\n### Important!\r\nThe module imports a function from a compiled .dll (C++). \r\nIf you get any import errors, install: https://download.visualstudio.microsoft.com/download/pr/8b92f460-7e03-4c75-a139-e264a770758d/26C2C72FBA6438F5E29AF8EBC4826A1E424581B3C446F8C735361F1DB7BEFF72/VC_redist.x64.exe\r\n\r\n\r\n### How to use it in Python \r\n\r\n```python\r\nimport cv2\r\nimport numpy as np\r\nfrom locate_pixelcolor_cpp_parallelfor import search_colors\r\n# 4525 x 6623 x 3 picture https://www.pexels.com/pt-br/foto/foto-da-raposa-sentada-no-chao-2295744/\r\npicx = r\"C:\\Users\\hansc\\Downloads\\pexels-alex-andrews-2295744.jpg\"\r\npic = cv2.imread(picx)\r\ncolors0 = np.array([[255, 255, 255]],dtype=np.uint8)\r\nresus0 = search_colors(pic=pic, colors=colors0, cpus=5)\r\ncolors1=np.array([(66, 71, 69),(62, 67, 65),(144, 155, 153),(52, 57, 55),(127, 138, 136),(53, 58, 56),(51, 56, 54),(32, 27, 18),(24, 17, 8),],dtype=np.uint8)\r\nresus1 = search_colors(pic=pic, colors=colors1, cpus=4)\r\nprint(resus1)\r\n####################################################################\r\n# Pretty good, but this one is better: https://github.com/hansalemaos/locate_pixelcolor_cpppragma\r\n%timeit resus0 = search_colors(pic=pic, colors=colors0, cpus=5)\r\n69.4 ms \u00c2\u00b1 302 \u00c2\u00b5s per loop (mean \u00c2\u00b1 std. dev. of 7 runs, 10 loops each)\r\n\r\nb,g,r = pic[...,0],pic[...,1],pic[...,2]\r\n%timeit np.where(((b==255)&(g==255)&(r==255)))\r\n150 ms \u00c2\u00b1 209 \u00c2\u00b5s per loop (mean \u00c2\u00b1 std. dev. of 7 runs, 10 loops each)\r\n####################################################################\r\n%timeit resus1 = search_colors(pic=pic, colors=colors1, cpus=5)\r\n151 ms \u00c2\u00b1 10.2 ms per loop (mean \u00c2\u00b1 std. dev. of 7 runs, 10 loops each)\r\n\r\n%timeit np.where(((b==66)&(g==71)&(r==69))|((b==62)&(g==67)&(r==65))|((b==144)&(g==155)&(r==153))|((b==52)&(g==57)&(r==55))|((b==127)&(g==138)&(r==136))|((b==53)&(g==58)&(r==56))|((b==51)&(g==56)&(r==54))|((b==32)&(g==27)&(r==18))|((b==24)&(g==17)&(r==8)))\r\n1 s \u00c2\u00b1 16.1 ms per loop (mean \u00c2\u00b1 std. dev. of 7 runs, 1 loop each)\r\n####################################################################\r\n```\r\n\r\n\r\n### The C++ Code \r\n\r\n```cpp\r\n#include <atomic>\r\n#include <ppl.h>\r\n\r\nstd::atomic<int> value(0);\r\n\r\nint create_id()\r\n{\r\n return std::atomic_fetch_add(&value, 1);\r\n}\r\n\r\nextern \"C\" __declspec(dllexport) void colorsearch(char *pic, char *colors, int width, int totallengthpic, int totallengthcolor, int *outputx, int *outputy, int *lastresult)\r\n{\r\n value = 0;\r\n\r\n concurrency::parallel_for(0, totallengthcolor / 3 + 1, [&](int i)\r\n {\r\n int r = i * 3;\r\n int g = i * 3 + 1;\r\n int b = i * 3 + 2;\r\n for (int j = 0; j <= totallengthpic; j += 3)\r\n {\r\n if ((colors[r] == pic[j]) && (colors[g] == pic[j + 1]) && (colors[b] == pic[j + 2]))\r\n {\r\n int dividend = j / 3;\r\n int quotient = dividend / width;\r\n int remainder = dividend % width;\r\n int upcounter = create_id();\r\n outputx[upcounter] = quotient;\r\n outputy[upcounter] = remainder;\r\n lastresult[0] = upcounter;\r\n }\r\n } });\r\n}\r\n// cl.exe /std:c++20 /fp:fast /EHsc /Oi /Ot /Oy /Ob3 /GF /Gy /MD /openmp /LD cloop.cpp /Fe:cloop.dll\r\n```\r\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Detects colors in images up to 10 x faster than Numpy",
"version": "0.11",
"split_keywords": [
"cpp",
"c++",
"image",
"search",
"parallel",
"rgb"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "73a81c45b658d03c92c8a05ee32937d846a1e5762047aa1666fe1c7fdd45fb7e",
"md5": "314d4be673e6af0d559a210cc239aa5a",
"sha256": "8d4e26e42029018330869c93018000e47ff01df311c8cb5f8d4994c4d4c1e2ff"
},
"downloads": -1,
"filename": "locate_pixelcolor_cpp_parallelfor-0.11-py3-none-any.whl",
"has_sig": false,
"md5_digest": "314d4be673e6af0d559a210cc239aa5a",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": null,
"size": 19279,
"upload_time": "2023-04-15T00:36:45",
"upload_time_iso_8601": "2023-04-15T00:36:45.821565Z",
"url": "https://files.pythonhosted.org/packages/73/a8/1c45b658d03c92c8a05ee32937d846a1e5762047aa1666fe1c7fdd45fb7e/locate_pixelcolor_cpp_parallelfor-0.11-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "a0c07c09798dc957a2e762777162e485a58b83192948ad2e72e6f59887703335",
"md5": "a6d11202a56e45248e4755a07cf7e79b",
"sha256": "15fd5c273f0fcbc1932d8d2c571313d31f10d4bfe9ea54b79791e1892321d1cb"
},
"downloads": -1,
"filename": "locate_pixelcolor_cpp_parallelfor-0.11.tar.gz",
"has_sig": false,
"md5_digest": "a6d11202a56e45248e4755a07cf7e79b",
"packagetype": "sdist",
"python_version": "source",
"requires_python": null,
"size": 18118,
"upload_time": "2023-04-15T00:36:48",
"upload_time_iso_8601": "2023-04-15T00:36:48.450515Z",
"url": "https://files.pythonhosted.org/packages/a0/c0/7c09798dc957a2e762777162e485a58b83192948ad2e72e6f59887703335/locate_pixelcolor_cpp_parallelfor-0.11.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2023-04-15 00:36:48",
"github": true,
"gitlab": false,
"bitbucket": false,
"github_user": "hansalemaos",
"github_project": "locate_pixelcolor_cpp_parallelfor",
"travis_ci": false,
"coveralls": false,
"github_actions": false,
"requirements": [
{
"name": "numpy",
"specs": []
}
],
"lcname": "locate-pixelcolor-cpp-parallelfor"
}