物体的颜色特征决定了灰度处理不是万能,对RGB分别处理具有相当的意义。

 #include <iostream>
#include <stdio.h>
#include "cv.h"
#include <highgui.h>
#include <opencv2/opencv.hpp>
#include <opencv2/legacy/legacy.hpp>
#include <opencv2/nonfree/nonfree.hpp>
#include <opencv2/nonfree/features2d.hpp>
#include <opencv2/flann/flann.hpp> using namespace std;
using namespace cv; #define PATH_IMG01 "../lolo.jpg" IplImage *g_pGrayImage = NULL;
IplImage *g_pGrayImg4ChannelR = NULL;
IplImage *g_pGrayImg4ChannelG = NULL;
IplImage *g_pGrayImg4ChannelB = NULL; IplImage *g_pBinaryImg4ChannelR = NULL;
IplImage *g_pBinaryImg4ChannelG = NULL;
IplImage *g_pBinaryImg4ChannelB = NULL;
IplImage *g_pBinaryImg4ChannelC = NULL; const char *pstrWindowsToolBarName4ChB = "ToolBarName4ChannelB";
const char *pstrWindowsToolBarName4ChG = "ToolBarName4ChannelG";
const char *pstrWindowsToolBarName4ChR = "ToolBarName4ChannelR";
const char *pstrWindowsToolBarName4ChC = "ToolBarName4ChannelC"; const char *pstrWindowsSrcTitle = "SrcImageTitle";
const char *pstrWindowsBinaryTitle4ChB = "BinaryTitle4B";
const char *pstrWindowsBinaryTitle4ChG = "BinaryTitle4G";
const char *pstrWindowsBinaryTitle4ChR = "BinaryTitle4R";
const char *pstrWindowsBinaryTitle4ChC = "BinaryTitle4C"; const char *pstr_title_chB = "Binary Image for Channel B";
const char *pstr_title_chG = "Binary Image for Channel G";
const char *pstr_title_chR = "Binary Image for Channel R"; void on_trackbar_channelB(int pos)
{
Mat src = Mat(g_pGrayImg4ChannelB);
Mat dst;
IplImage img_out; ////////////////////////////////////////////////////////
GaussianBlur(src,dst,Size(,),,);
// medianBlur(src,dst,10);
// blur(src,dst,Size(5,5),Point(-1,-1));
// bilateralFilter(src,dst,25, 25*2, 25/2);
img_out = IplImage(dst);
//////////////////////////////////////////////////////// // (1)
cvThreshold(&img_out, g_pBinaryImg4ChannelB, pos, , CV_THRESH_BINARY); // (2)
int gap = ;
IplImage *pBinaryImg4ChannelB = cvCreateImage(cvGetSize(g_pGrayImg4ChannelB), IPL_DEPTH_8U, );
cvThreshold(&img_out, pBinaryImg4ChannelB, pos + gap, , CV_THRESH_BINARY); // (3)
IplImage *pBinaryImg4ChannelB_DV = cvCreateImage(cvGetSize(g_pBinaryImg4ChannelB), IPL_DEPTH_8U, );
cvAbsDiff(g_pBinaryImg4ChannelB, pBinaryImg4ChannelB, pBinaryImg4ChannelB_DV);
// cvShowImage(pstrWindowsBinaryTitle4ChB, pBinaryImg4ChannelB_DV);
cvShowImage(pstrWindowsBinaryTitle4ChB, g_pBinaryImg4ChannelB);
} void on_trackbar_channelG(int pos)
{
Mat src = Mat(g_pGrayImg4ChannelG);
Mat dst;
IplImage img_out; ////////////////////////////////////////////////////////
GaussianBlur(src,dst,Size(,),,);
img_out = IplImage(dst);
//////////////////////////////////////////////////////// // (1)
cvThreshold(&img_out, g_pBinaryImg4ChannelG, pos, , CV_THRESH_BINARY); // (2)
int gap = ;
IplImage *pBinaryImg4ChannelG = cvCreateImage(cvGetSize(g_pGrayImg4ChannelG), IPL_DEPTH_8U, );
cvThreshold(&img_out, pBinaryImg4ChannelG, pos + gap, , CV_THRESH_BINARY); // (3)
IplImage *pBinaryImg4ChannelG_DV = cvCreateImage(cvGetSize(g_pBinaryImg4ChannelG), IPL_DEPTH_8U, );
cvAbsDiff(g_pBinaryImg4ChannelG, pBinaryImg4ChannelG, pBinaryImg4ChannelG_DV);
// cvShowImage(pstrWindowsBinaryTitle4ChG, pBinaryImg4ChannelG_DV);
cvShowImage(pstrWindowsBinaryTitle4ChG, g_pBinaryImg4ChannelG);
} void on_trackbar_channelR(int pos)
{
Mat src = Mat(g_pGrayImg4ChannelR);
Mat dst;
IplImage img_out; ////////////////////////////////////////////////////////
GaussianBlur(src,dst,Size(,),,);
img_out = IplImage(dst);
// cvShowImage( "Task 8*: Gaussian Blur", &img_out);
// cvWaitKey(0);
//////////////////////////////////////////////////////// // (1)
cvThreshold(&img_out, g_pBinaryImg4ChannelR, pos, , CV_THRESH_BINARY); // (2)
int gap = ;
IplImage *pBinaryImg4ChannelR = cvCreateImage(cvGetSize(g_pGrayImg4ChannelR), IPL_DEPTH_8U, );
cvThreshold(&img_out, pBinaryImg4ChannelR, pos + gap, , CV_THRESH_BINARY); // (3)
IplImage *pBinaryImg4ChannelR_DV = cvCreateImage(cvGetSize(g_pBinaryImg4ChannelR), IPL_DEPTH_8U, );
cvAbsDiff(g_pBinaryImg4ChannelR, pBinaryImg4ChannelR, pBinaryImg4ChannelR_DV);
// cvShowImage(pstrWindowsBinaryTitle4ChR, pBinaryImg4ChannelR_DV);
cvShowImage(pstrWindowsBinaryTitle4ChR, g_pBinaryImg4ChannelR);
} void on_trackbar_channelC(int pos)
{
cvOr(g_pBinaryImg4ChannelB, g_pBinaryImg4ChannelG, g_pBinaryImg4ChannelC);
cvOr(g_pBinaryImg4ChannelC, g_pBinaryImg4ChannelR, g_pBinaryImg4ChannelC); cvShowImage(pstrWindowsBinaryTitle4ChC, g_pBinaryImg4ChannelC);
} int main(void)
{
// 1. src image and resize.
Mat src = imread(PATH_IMG01);
const int zoom = ;
resize(src, src, Size(src.cols/zoom, src.rows/zoom)); IplImage srcImage = IplImage(src);
IplImage *pSrcImage = &srcImage; // 2. split r, g, b channel images.
Mat channel[]; split(pSrcImage, channel); // imshow("B",channel[0]);
// imshow("G",channel[1]);
// imshow("R",channel[2]);
// waitKey(0); IplImage img_channelB = IplImage(channel[]);
IplImage img_channelG = IplImage(channel[]);
IplImage img_channelR = IplImage(channel[]); g_pGrayImg4ChannelB = &img_channelB;
g_pGrayImg4ChannelG = &img_channelG;
g_pGrayImg4ChannelR = &img_channelR; // 3. get r, g, b binary images.
g_pBinaryImg4ChannelB = cvCreateImage(cvGetSize(g_pGrayImg4ChannelB), IPL_DEPTH_8U, );
g_pBinaryImg4ChannelG = cvCreateImage(cvGetSize(g_pGrayImg4ChannelG), IPL_DEPTH_8U, );
g_pBinaryImg4ChannelR = cvCreateImage(cvGetSize(g_pGrayImg4ChannelR), IPL_DEPTH_8U, ); // 4.1 show src image.
cvNamedWindow(pstrWindowsSrcTitle, CV_WINDOW_AUTOSIZE);
cvShowImage(pstrWindowsSrcTitle, pSrcImage); // 4.2 create r, g, b windows.
cvNamedWindow(pstrWindowsBinaryTitle4ChB, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pstrWindowsBinaryTitle4ChG, CV_WINDOW_AUTOSIZE);
cvNamedWindow(pstrWindowsBinaryTitle4ChR, CV_WINDOW_AUTOSIZE); // 4.3 create toolbar for r, g, b windows.
int nThreshold = ;
cvCreateTrackbar(pstrWindowsToolBarName4ChB, pstrWindowsBinaryTitle4ChB, &nThreshold, , on_trackbar_channelB);
cvCreateTrackbar(pstrWindowsToolBarName4ChG, pstrWindowsBinaryTitle4ChG, &nThreshold, , on_trackbar_channelG);
cvCreateTrackbar(pstrWindowsToolBarName4ChR, pstrWindowsBinaryTitle4ChR, &nThreshold, , on_trackbar_channelR); // 4.4 create combine result show.
g_pBinaryImg4ChannelC = cvCreateImage(cvGetSize(g_pGrayImg4ChannelR), IPL_DEPTH_8U, );
cvNamedWindow(pstrWindowsBinaryTitle4ChC, CV_WINDOW_AUTOSIZE);
cvCreateTrackbar(pstrWindowsToolBarName4ChC, pstrWindowsBinaryTitle4ChC, &nThreshold, , on_trackbar_channelC); // 4.5 run.
on_trackbar_channelB();
on_trackbar_channelG();
on_trackbar_channelR();
on_trackbar_channelC(); cvWaitKey(); // 5. destroy trash.
cvDestroyWindow(pstrWindowsSrcTitle);
cvDestroyWindow(pstrWindowsBinaryTitle4ChB);
cvDestroyWindow(pstrWindowsBinaryTitle4ChG);
cvDestroyWindow(pstrWindowsBinaryTitle4ChR);
cvDestroyWindow(pstrWindowsBinaryTitle4ChC); cvReleaseImage(&pSrcImage);
cvReleaseImage(&g_pBinaryImg4ChannelB);
cvReleaseImage(&g_pBinaryImg4ChannelG);
cvReleaseImage(&g_pBinaryImg4ChannelR);
cvReleaseImage(&g_pBinaryImg4ChannelC); return ;
}

HSV channels 能更好地解决问题? 亮度60-80之间是一个不错的判定效果。

IplImage* pSrcHsv=cvCreateImage(cvGetSize(pSrcImage),IPL_DEPTH_8U,);
cvCvtColor(pSrcImage, pSrcHsv, CV_BGR2HSV); Mat channel[];
split(pSrcHsv, channel);

相关代码

通过亮度通道进行二值刷选后,再采用轮廓线判断继续缩小范围。

是否有判别基本几何形状的高效方法,找出其中的凸四边形?

Sol 01: “面积比”: size of contour/size of its bounding rectangle

[OpenCV] Samples 04: contours2

[OpenCV] Samples 05: convexhull

[OpenCV] Samples 16: Decompose and Analyse RGB channels的更多相关文章

  1. OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解

    原文:OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解 Title : cv::Mat depth/dims/channels ...

  2. [OpenCV] Samples 10: imagelist_creator

    yaml写法的简单例子.将 $ ./ 1 2 3 4 5 命令的参数(代表图片地址)写入yaml中. 写yaml文件. 参考:[OpenCV] Samples 06: [ML] logistic re ...

  3. JS-011-颜色进制转换(RGB转16进制;16进制转RGB)

    在网页开发的时候,经常需要进行颜色设置,因而经常需要遇到进行颜色进制转换的问题,例如:RGB转16进制:16进制转RGB),前几天在测试的时候,发现网站的颜色进制转换某类16进制颜色(例如:#0000 ...

  4. js 颜色16进制转RGB方法

    //颜色16进制转RGB方法 String.prototype.colorRgb = function(){ var sColor = this.toLowerCase(); //十六进制颜色值的正则 ...

  5. bgcolor RGB 和16进制之间的转换,16进制转RGB,源码

    <p>bgcolor RGB 和16进制之间的转换,16进制转RGB,源码例如:<br /> 输入 201,255,201 转换成 #C9FFC9</p> < ...

  6. JS实现16进制和RGB转换

    作为前端开发而言,不可避免的会遇到颜色取值,字符串和数字直接的转换,博主为此写了一个小工具,实现色值之间的在线转换. 前置知识点: parseInt, toString parseInt(value ...

  7. OpenCV中对Mat里面depth,dims,channels,step,data,elemSize和数据地址计算的理解 (转)

    cv::Matdepth/dims/channels/step/data/elemSizeThe class Mat represents an n-dimensional dense numeric ...

  8. 访问图像中的像素[OpenCV 笔记16]

    再更一发好久没更过的OpenCV,不过其实写到这个部分对计算机视觉算法有所了解的应该可以做到用什么查什么了,所以后面可能会更的慢一点吧,既然开了新坑,还是机器学习更有研究价值吧... 图像在内存中的存 ...

  9. OpenCV 学习笔记(9)RGB转换成灰度图像的一个常用公式Gray = R*0.299 + G*0.587 + B*0.114

    https://blog.csdn.net/fly_wt/article/details/86432886 RGB转换成灰度图像的一个常用公式是:Gray = R*0.299 + G*0.587 + ...

随机推荐

  1. Tidis单机部署

    拉取镜像 docker pull yongman/tidis:latest docker pull pingcap/tikv docker pull pingcap/pd 运行pd,由于Raft算法3 ...

  2. JDBC(1)—Connection

    一.简介: 1.JDBC(Java Database Connectivity)是一个独立于特定数据库管理系统.通用的SQL数据库存取和操作的 *公共接口(一组API) *定义了用来访问数据库的标准j ...

  3. c++ try catch 问题

    以前都是用try{} catch(…){}来捕获C++中一些意想不到的异常, 今天看了Winhack的帖子才知道,这种方法在VC中其实是靠不住的.例如下面的代码: 以前都是用try{} catch(… ...

  4. cordova 开发笔记

    1.安装 Node.js Cordova需要Node.js环境,访问https://nodejs.org 下载安装, LTS版本即可,不要最新版. 2.安装 Cordova 执行下述命令把Cordov ...

  5. iOS:使用莱文斯坦距离算法计算两串字符串的相似度

    Levenshtein:莱文斯坦距离 Levenshtein的经典算法,参考http://en.wikipedia.org/wiki/Levenshtein_distance的伪代码实现的,同时参考了 ...

  6. 6、Python变量

    Python变量 变量的定义 变量是计算机内存中的一块区域,变量可以存储规定范围内的值,而且值可以改变. 变量的命名 变量名有字母.数字.下划线组成. 数字不能开头 不可以使用关键字 a a1 a_ ...

  7. inet_ntoa内存问题

    最近写的一个程序,大致用到以下代码: WSADATA wsaData; WSAStartup (MAKEWORD( 2, 2 ),&wsaData); struct addrinfo *aiL ...

  8. Visio画流程图风格设置

    第一步:选取设计下选用“简单” 第二步:设置颜色为“铅笔” 第三步:设置效果为“辐射” 第四步:效果

  9. 大数模板 poj3982

    1. 这个模板不是自己写的,转载的别人转载的,还没学完c++的我,想写也没有那能力. 这个模板我用在了POJ的一道题上,传送门--POJ3982 一般大数的题,都可用这个模板解决,仅仅须要改动主函数就 ...

  10. 3728 联合权值[NOIP 2014 Day1 T2]

    来源:NOIP2014 Day1 T2 OJ链接: http://codevs.cn/problem/3728/ https://www.luogu.org/problemnew/show/P1351 ...