*以下内容并非正规解决方案,效仿请谨慎。

之前有介绍过阿里云的鉴黄API接口http://blog.csdn.net/sm9sun/article/details/53321888

其支持:porn: 黄图检测,ocr:文字识别,illegal: 暴恐敏感识别三个业务

其API也很人性的把其返回的json串做出了解析,我们可以直接拿到相应的返回值。

而如果想对其做进一步的开发,比如说拿到ocr后再做敏感词识别

字典树实现敏感词检索http://blog.csdn.net/sm9sun/article/details/53308643

那么想了想最好还是回到C++去处理这部分工作。

之前也有写过C++嵌入python开发的博客http://blog.csdn.net/sm9sun/article/details/53392760

网上找了一下,也确实有实现python的字典与C++ map容器转换的方法(用PyDict_Next遍历python的字典对象)

不过想来想去总是感觉有一些麻烦。反正字符串是万能的,我们还不如干脆拿到python的返回json串(实际是转换后的string字符串)

然后自己去做解析处理,简单粗暴~

首先我们需要strstr函数来进行字典关键词的匹配,但是有一个问题,我们知道strstr匹配不到的时候会返回NULL指针的,而我们把json串当作string去匹配处理的话肯定会出现某个字典匹配不到的情况,那么这就非常的不安全。所以我们在其外部套了一层,也顺便把字典名给去掉

string my_strstrEX(char * _Str,const char * _SubStr)
{char *posStr=strstr(_Str,_SubStr);if(posStr==NULL){return "";}else{return string(posStr+strlen(_SubStr));}
}

还有就是需要去除[] “”等区间符号

/*
功能:去掉区间符号dictword:字典字符串
c       :区间符,例如:[] '' "" (){}return  :关键词*/
string getKeyBydictword(string dictword,char c)
{if(strlen(dictword.c_str())<2)   //如果长度小于2,直接返回错误{return "ErrorString";}char ec=c;               //结束符if('\"'==c) ec='\"';if('\''==c) ec='\'';if('['==c) ec=']';if('('==c) ec=')';if('{'==c) ec='}';int si=0,ei=-1;int nsi=0,nei=0;//记录符号出现的次数,当nsi和nei相等时,说明其是匹配的一对for(int i=0;i<=strlen(dictword.c_str())-1;i++){if(dictword[i]==ec&&(nsi>nei))      //因为某些区间符两边相等,如"",所以判断标准为nsi>nei{nei++;if(nsi==nei){ei=i;break;}      }       else if(dictword[i]==c){nsi++;if(nsi==1){si=i+1;}           }}if(nei>0)return dictword.substr(si,ei-si);elsereturn "ErrorString";
}

接下来就是主函数的调用了

完整代码:

// call_py_test.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "Python.h"
#include <string>
#include <iostream>using namespace std;/*
图像识别py
返回字典结构体
*/struct retdict
{
string strCode;   //执行信息
string strMsg;    //异常信息
string strOcr;    //文字识别
int nPorn;        //色情返回值
int nIllegal;     //暴恐返回值
};/*
由于strstr匹配不到检索字串Substr时会返回NULL
考虑到安全性问题,故在此加了一层NULL的处理
额外过滤掉检索字串的长度
*/
string my_strstrEX(char * _Str,const char * _SubStr)
{char *posStr=strstr(_Str,_SubStr);if(posStr==NULL){return "";}else{return string(posStr+strlen(_SubStr));}
}/*
const char*的重载
*/
string my_strstrEX(const char * _Str,const char * _SubStr)
{const char *posStr=strstr(_Str,_SubStr);if(posStr==NULL){return "";}else{return string(posStr+strlen(_SubStr));}
}/*
功能:去掉区间符号dictword:字典字符串
c       :区间符,例如:[] '' "" (){}return  :关键词*/
string getKeyBydictword(string dictword,char c)
{if(strlen(dictword.c_str())<2)   //如果长度小于2,直接返回错误{return "ErrorString";}char ec=c;               //结束符if('\"'==c) ec='\"';if('\''==c) ec='\'';if('['==c) ec=']';if('('==c) ec=')';if('{'==c) ec='}';int si=0,ei=-1;int nsi=0,nei=0;//记录符号出现的次数,当nsi和nei相等时,说明其是匹配的一对for(int i=0;i<=strlen(dictword.c_str())-1;i++){if(dictword[i]==ec&&(nsi>nei))      //因为某些区间符两边相等,如"",所以判断标准为nsi>nei{nei++;if(nsi==nei){ei=i;break;}      }       else if(dictword[i]==c){nsi++;if(nsi==1){si=i+1;}           }}if(nei>0)return dictword.substr(si,ei-si);elsereturn "ErrorString";
}int main(int argc, char** argv)
{ //初始化Python //在使用Python系统前,必须使用Py_Initialize对其 //进行初始化。它会载入Python的内建模块并添加系统路 //径到模块搜索路径中。这个函数没有返回值,检查系统 //是否初始化成功需要使用Py_IsInitialized。 Py_Initialize(); // 检查初始化是否成功 if ( !Py_IsInitialized() ) { return -1; } // 添加当前路径 //把输入的字符串作为Python代码直接运行,返回0 //表示成功,-1表示有错。大多时候错误都是因为字符串 //中有语法错误。 PyRun_SimpleString("import sys"); PyRun_SimpleString("sys.path.append('./')"); PyObject *pName,*pModule,*pDict,*pFunc,*pArgs; // 载入脚本 pName = PyString_FromString("imgfocpp"); pModule = PyImport_Import(pName); if ( !pModule ) { printf("can't find imgfocpp.py"); getchar(); return -1; } pDict = PyModule_GetDict(pModule); if ( !pDict ) { return -1; } // 找出函数名为retStr_test的函数 pFunc = PyDict_GetItemString(pDict, "imgmain"); if ( !pFunc || !PyCallable_Check(pFunc) ) { printf("can't find function [imgmain]"); getchar(); return -1; } // 参数进栈 *pArgs; pArgs = PyTuple_New(1); //  PyObject* Py_BuildValue(char *format, ...) //  把C++的变量转换成一个Python对象。当需要从 //  C++传递变量到Python时,就会使用这个函数。此函数 //  有点类似C的printf,但格式不同。常用的格式有 //  s 表示字符串, //  i 表示整型变量, //  f 表示浮点数, //  O 表示一个Python对象。 string arg1="图片的URL";PyTuple_SetItem(pArgs, 0, Py_BuildValue("s",arg1.c_str())); // 调用Python函数 char* strRet;PyObject* result=PyObject_CallObject(pFunc, pArgs); //返回值类型转换PyArg_Parse(result, "s", &strRet);//cout<<"strRet="<<strRet<<endl;retdict a;string Codedict=my_strstrEX(strRet,"\"Code\":");a.strCode=getKeyBydictword(Codedict,'\"');string Msgdict=my_strstrEX(strRet,"\"Msg\":");a.strMsg=getKeyBydictword(Msgdict,'\"');// the list string format:   "Label":[int],"Rate":[int]string Porndict=my_strstrEX(strRet,"\"PornResult\":");string listPorn=getKeyBydictword(Porndict,'{');a.nPorn=atoi(my_strstrEX(listPorn.c_str(),"\"Rate\":").c_str());string Illegaldict=my_strstrEX(strRet,"\"IllegalResult\":");string listIllegal=getKeyBydictword(Illegaldict,'{');a.nIllegal=atoi(my_strstrEX(listIllegal.c_str(),"\"Rate\":").c_str());string Ocrdict=my_strstrEX(strRet,"\"String\":");a.strOcr=getKeyBydictword(Ocrdict,'[');cout<<"******************retdict******************"<<endl;cout<<a.strCode<<endl;cout<<a.strMsg<<endl;cout<<a.strOcr<<endl;cout<<a.nPorn<<endl;cout<<a.nIllegal<<endl;Py_DECREF(pName); Py_DECREF(pArgs); Py_DECREF(pModule); // 关闭Python Py_Finalize(); system("pause");return 0; }

C++做字符串解析工作,python代码就很简单了,直接返回string类型的json串就好。

#coding=utf-8
def imgmain(imgurl):import sysreload(sys)sys.setdefaultencoding('gbk')imgurl2=imgurl.encode('utf8')sys.setdefaultencoding('utf8')# 同步图片检测服务接口, 会实时返回检测的结果from aliyunsdkcore import clientfrom aliyunsdkgreen.request.v20161018 import ImageDetectionRequestimport json# 请替换成你自己的accessKeyId、accessKeySecret, 您可以类似的配置在配置文件里面,也可以直接明文替换#clt = client.AcsClient("1", "2",'3')clt = client.AcsClient("你自己的accessKeyId", "你自己的accessKeySecret",'cn-hangzhou')request = ImageDetectionRequest.ImageDetectionRequest()request.set_accept_format('json')# 设置成同步调用request.set_Async('false')# 设置要检测的图片链接# json字符串格式, 同步只支持单张图片request.set_ImageUrl(json.dumps([imgurl2]))# 设置要检测的服务场景# 异步支持多个场景同时识别# porn: 黄图检测# ocr: ocr文字识别# illegal: 暴恐敏感识别request.set_Scene(json.dumps(["porn","ocr","illegal"]))response = clt.do_action(request)#"The request has failed due to a temporary failure of the server"print response.encode('gbk')return response.encode('gbk')

调用成功截图:

注:ocr返回的其实是个列表,所以用引号括起来,每个独立的词汇后面会有一个“,”这里就先不作处理,

等与敏感词检索联立时再进行切分。

调用失败截图:

pythonの鉴黄之路(五)——强行解析json串相关推荐

  1. pythonの鉴黄之路(四)——urllib模块批量下载

    好了,现在鉴黄的demo可以跑通了,就差大量的数据了(就是黄图) 这可难倒了纯洁的宝宝. 本宝宝表示找了好几天都找不到一张黄图 后来问了一些老司机,得到了一些资♂源♂丰♂富♂的网址 不过本宝宝还是不好 ...

  2. pythonの鉴黄之路(二)——图片转base64码

    上篇博客的YCbCr鉴黄有些过于浮夸 http://blog.csdn.net/sm9sun/article/details/53319959 于是经过慎重决定,我们打算采取调用外部成熟的接口来完成鉴 ...

  3. pythonの鉴黄之路(一)——YCbCr简易版鉴黄脚本

    先介绍一下YCbCr YCbCr或Y'CbCr有的时候会被写作:YCBCR或是Y'CBCR,是色彩空间的一种,通常会用于影片中的影像连续处理,或是数字摄影系统中. Y'为颜色的亮度(luma)成分.而 ...

  4. Python获取丁香园疫情数据并解析json数据

    Python获取丁香园疫情数据并解析json数据 在利用pyecharts V1.x版本,使用Map对象进行制图时,对数据格式的要求比较高,如果数据格式不正确可能达不到我们预期的效果.在我的前一篇文章 ...

  5. golang 递归方式解析json串

    golang 递归方式解析json串 package mainimport ("fmt""encoding/json" )func jsonArrayParse ...

  6. Rapidjson的简单使用(拼接json串,存取文件中的json,解析json串)

    Rapidjson的简单使用示例 很早就想用用Markdown了,一直没机会.今天就来试一下 先放个目录: Rapidjson的简单使用示例 rapidjson官方教程 本示例所用环境 示例代码与注释 ...

  7. Python“鉴黄”小程序,自动识别检测物体的颜色

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 李秋键 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...

  8. Java用JSONObject-lib来解析json串

    直接贴代码:(所需jar包:json-lib.jar,可能会关联一些其它的jar包,请自行搜索.)import java.util.ArrayList; import java.util.HashMa ...

  9. Swift: 用Alamofire做http请求,用ObjectMapper解析JSON

    示例代码看最后. 跟不上时代的人突然间走在了时代的前列,果然有别样的风景.首先鄙视一下AFNetworking.这个东西实在太难用了.不想封装都不行,要不写一大堆代码. NSURL *URL = [N ...

最新文章

  1. 一图理解腾讯本次组织结构重大变革的方向和目的
  2. CentOS 6.6编译安装Squid 配置反向代理服务器
  3. NYOJ 888 取石子(九)
  4. 【Flashback】Flashback Database闪回数据库功能实践
  5. python3 多线程_python3--多线程的使用
  6. 解决Javascript疲劳的方法-以及其他所有疲劳
  7. 操作系统之内存管理:2、内存管理的功能(内存分配回收、扩充、地址转化、存储保护)
  8. iOS中事件的传递和响应者链条
  9. 全国计算机报名入口攀枝花学院,2017年攀枝花学院艺术类专业考试网上报名入口...
  10. Pandas手册汉化
  11. 分式智能计算机在线计算,全能智能计算器
  12. 四大列表控件之RadioButtonList控件(单选按钮)
  13. Spark数据倾斜解决
  14. 3D体感试衣镜,实现虚拟试穿,提升顾客的购物体验!
  15. Shape Inpainting using 3D Generative Adversarial Network and Recurrent Convolutional Networks
  16. 算法设计与分析——散列表/哈希表(Hash Table):直接寻址表
  17. 可微和可导的关系,全微分、偏微分、偏导数
  18. Zotero使用指南04:群组功能
  19. discuz 获取所有版块并按父子层级排版
  20. 推荐收藏系列:一文理解JVM虚拟机(内存、垃圾回收、性能优化)解决面试中遇到问题(图解版)

热门文章

  1. 南大cssci期刊目录_最新版CSSCI管理学和经济学来源期刊目录(20192020)及增减变化!【南大核心】...
  2. linux c语言 udp 接收和发送数据用同一个端口_网络编程基础入门及TCP,UDP
  3. php编写个人所得税单元测试,php趣味编程-php求个人所得税
  4. php json 压缩传输,php json数据使用gzip压缩输出
  5. python的empty函数_python中numpy.empty()函数的用法
  6. Numpy Math functions
  7. PspNet在MMsegmentation框架下成功训练Pascal VOC2012数据集及踩坑实录
  8. VOC和COCO数据集标注格式的介绍
  9. CSS3特效 - 呼吸灯效果
  10. 计算机硬件课题,课题:计算机硬件结构介绍