您当前位置: 首页 » 11 月 2016
按日期归档: 11 月 2016

【opencv、颜色存储方式】imread的IMREAD_COLOR方式解码后是BGR方式存储

最近的项目中需要用到将RGB空间转换成HSV空间,转换后一直都感觉不对劲,最后才发现imread中的IMREAD_COLOR参数。

在opencv中的注释中提到IMREAD_COLOR方式是将数据尝试解码成BGR方式存储。

数据解码后,实际在上内存中的数据存储方式确实为BGR,通过imwrite或者imshow时,数据应该会被默认转换成实际的图像格式(没有看代码去考证,因为bmp就是BGR的序列)。

在进行色彩空间转换时,例如:BGR(或RBG) -> HSV时,如果将CV_BGR2HSV和CV_RGB2HSV混淆,最后的结果会引起色彩区域置换。所以就有问题了!

2016-11-30 | | 图像处理, 音视频_图像相关

【opencv、颜色存储方式】imread的IMREAD_COLOR方式解码后是BGR方式存储已关闭评论

【matlab、启动错误】在远程桌面中无法启动matlab问题

最近一直在通过远程桌面的方式使用笔记本,突然发现matlab死活都打不开,出现如下错误

555

 

起初以为安装出问题,后来网上看了下才知道是远程桌面的锅。直接用基本登录,问题解决。

2016-11-22 | | matlab, win, 图像处理, 数据结构 & 算法, 编码技巧, 音视频_图像相关

【matlab、启动错误】在远程桌面中无法启动matlab问题已关闭评论

最近手头需要做的几件事情

  1. 看nat穿越中的开源代码,优先看udt。先把udt实现看明白(主要是重发包这些)
  2. webrtc之前项目中没有用到的代码继续学习
  3. tcp单边和双边加速的原理理解和学习
  4. opencv部分代码深入看
  5. *caffe,实在没办法了,模式识别中的模板匹配越做越复杂了,要换个路子走了
2016-11-21 | | [linux总结], *生活*, 思考

最近手头需要做的几件事情已关闭评论

【代码级优化、细枝末节、汇编】关于for一些写法细枝末节的优化

首先先看一下下面两段C++的代码

for_1

for_3

这两段代码唯一的区别在于条件区域的代码不同,一个是在外面先把end的游标获取到,一个是在for执行的过程中动态获取。如果实在想不明白,那就直接上汇编把。

for_2

for_4

实际上在《高效C++》中就提到过关于for条件区域代码每次哪一种写法性能好,哪一种写法性能差。由于end函数在这里的性能开销可以忽略不计,但如果不是调用end而是调用一个性能开销比较大的函数,那么这个for循环会很慢;在多线程模型中,如果for中的条件区域代码是线程间需要同步的,那么有可能这个条件区块代码的执行结果在每一次循环时都会发生变化。

对于这种代码级的优化,实际中最好少用或者不用,但并不是不带着优化的思维去写代码,而是在写的时候就要意识到这块代码可能会成性能瓶颈。

2016-11-19 | | win, windbg, 思考, 算法导论, 编码技巧

【代码级优化、细枝末节、汇编】关于for一些写法细枝末节的优化已关闭评论

奇葩的笔试题,符号优先级

首先说明,本文章讲述的是C、C++方面的奇葩类笔试题,之所以奇葩是因为没有考到C、C++中真正需要关注的部分,也间接能看出出题人对C、C++的了解层度。

 

最近在外面试,有做笔试,也有不做笔试的。因为工作有一些时段,所以不做笔试也算说的去,但一遇到做笔试题往往弄得我哭笑不得。不是拿一些太基础的题来糊弄人,就是拿一些技巧性的题目来糊弄人。最为关键是招聘方所谓的技术人员还很自以为是。面试应该是互相尊重的过程,而不是耀武扬威的一个过程,下面就分享这么一题笔试题,也算是复习一下我自己的基础。

 


int count=0;
int iarraytestA[10] = {11};
int iarraytestB[10] = {11};
int iarraytestC[10] = {11};

while(count < 10)
{
iarraytestA[count++] = count;
}

count = 0;
while(count < 10)
{
iarraytestB[++count] = count;
}

count = 0;
iarraytestC[++count] = count;

 

求iarraytestA和iarraytestB的结果。用vs跑了一下,结果一样:

iarraytestA:0,1,2,3,4,5,6,7,8,9
iarraytestB:11,1,2,3,4,5,6,7,8,9
iarraytestB:11,1,0,0,0,0,0,0,0,0

后来仔细想想,这个应该是算术优先级的问题。这里面的符号有几个:

赋值、自增(前向和后向)、数组寻址

查了一下符号优先级表,发现++运算符的优先级和[]一样,而=的优先级就不用多说,应该是最低的。
由此可以得出上述结论。

首先在这套题里,主要考了笔试C、C++中对这几个符号的认识,另一个这道题最蠢的还在于使用了不该用的技巧在考人。在C、C++规范中对相同优先级的符号做过的约束并不是很明确(C++11有所改善),在高效C++中有大量例子说明不应该使用技巧性过强的写法,这样会导致不同编译或不同编译参数编译出来的代码有不同行为。

这也同样说明了出该笔试题的人对C++也不是那么了解,真正在C++中笔试中有很多类型的题目可以出,但也不是都能出,因为语言规范的原因,对于单纯考算法的问题,也有很多大神做过讨论。我只是觉得学以致用,考什么都不要紧,关键和工作实质内容有没有关联?

ps:另外强烈鄙视钓鱼招聘,叫人过去面试就是为了打探技术方法和商业信息!

2016-11-17 | | [奇葩类]求上进系列, *生活*, 思考, 编码技巧

奇葩的笔试题,符号优先级已关闭评论

【pthread、多线程、同步】关于pthread条件变量的疑惑

由于最近在看开源代码,手里的开源代码为了能够比较好的可移植性,在代码中加了很多宏,并在linux用了pthread库。

其中对于pthread的条件变量理解很是疑惑,看pthread手册后还是有不解,感觉条件变量用起来太奇怪,在pthread_cond_wait时,互斥到底有没有释放等问题上没搞明白,上代码调试后遍便豁然开朗。先贴一个修改过的官方代码例子:

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>

#include <iostream>

#include <unistd.h>

using namespace std;

#define NUM_THREADS  3
#define TCOUNT 10
#define COUNT_LIMIT 12

int     count = 0;
pthread_mutex_t count_mutex;
pthread_cond_t count_threshold_cv;

void *inc_count(void *t)
{
  int i;
  long my_id = (long)t;

  for (i=0; i < TCOUNT; i++) {
    pthread_mutex_lock(&count_mutex);
    count++;

    /*
    Check the value of count and signal waiting thread when condition is
    reached.  Note that this occurs while mutex is locked.
    */
    /*if (count == COUNT_LIMIT)*/ {
      printf("inc_count(): thread %ld, count = %d  Threshold reached. ",
             my_id, count);
      pthread_cond_signal(&count_threshold_cv);
      printf("Just sent signal.\n");
      }
    printf("inc_count(): thread %ld, count = %d, unlocking mutex\n",
	   my_id, count);
    pthread_mutex_unlock(&count_mutex);

    /* Do some work so threads can alternate on mutex lock */
    sleep(1);
    }
  pthread_exit(NULL);
}

void *watch_count(void *t)
{
  long my_id = (long)t;

  printf("Starting watch_count(): thread %ld\n", my_id);

  /*
  Lock mutex and wait for signal.  Note that the pthread_cond_wait routine
  will automatically and atomically unlock mutex while it waits.
  Also, note that if COUNT_LIMIT is reached before this routine is run by
  the waiting thread, the loop will be skipped to prevent pthread_cond_wait
  from never returning.
  */
  pthread_mutex_lock(&count_mutex);
  while (1) {
    printf("watch_count(): thread %ld Count= %d. Going into wait...\n", my_id,count);
    pthread_cond_wait(&count_threshold_cv, &count_mutex);
    printf("watch_count(): thread %ld Condition signal received. Count= %d\n", my_id,count);
    printf("watch_count(): thread %ld Updating the value of count...\n", my_id,count);
    //count += 125;
    printf("watch_count(): thread %ld count now = %d.\n", my_id, count);
    }
  printf("watch_count(): thread %ld Unlocking mutex.\n", my_id);
  pthread_mutex_unlock(&count_mutex);
  pthread_exit(NULL);
}

void cond_test()
{
	cout << "---------- cond_test ----------" << endl;

	int i, rc;
	long t1=1, t2=2, t3=3;
	pthread_t threads[3];
	pthread_attr_t attr;

	/* Initialize mutex and condition variable objects */
	pthread_mutex_init(&count_mutex, NULL);
	pthread_cond_init (&count_threshold_cv, NULL);

	/* For portability, explicitly create threads in a joinable state */
	pthread_attr_init(&attr);
	pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);

	pthread_create(&threads[0], &attr, watch_count, (void *)t1);
	usleep(1000*20);
	pthread_create(&threads[1], &attr, inc_count, (void *)t2);
	//pthread_create(&threads[2], &attr, inc_count, (void *)t3);

	/* Wait for all threads to complete */
	for (i = 0; i < NUM_THREADS; i++) {
		pthread_join(threads[i], NULL);
	}
	printf ("Main(): Waited and joined with %d threads. Final value of count = %d. Done.\n",
	          NUM_THREADS, count);

	/* Clean up and exit */
	pthread_attr_destroy(&attr);
	pthread_mutex_destroy(&count_mutex);
	pthread_cond_destroy(&count_threshold_cv);
	//pthread_exit (NULL);
}

首先说一下例子,主线程创建一个inc线程和watch线程,每次inc线程激活条件变量,这时watch线程被激活。
为了测试在pthread_cond_wait函数进入是,互斥有没有被释放掉。因此注释掉高亮部分的代码,发现inc线程永远不会被激活。说明在pthread_cond_wait时会将互斥进行释放,接下来等有空一定要抽空看看pthread的实现代码。以及比较一下vs是如何将pthread库进行伪封装后在windows上提供使用的。

2016-11-15 | | [linux总结]

【pthread、多线程、同步】关于pthread条件变量的疑惑已关闭评论

【chromium、webrtc、gn】引入gn之后下载代码和生成vs工程的方法

按照惯例,还是一如既往的通过代理进行下代码,并生成工程。因为webrtc是chromium里面的一个组件,所以webrtc和chromium的下载和生成工程的方法大同小异。

具体步骤如下:

1. 首先把depot_tools装好。

2. 配置代理

netsh set winhttp proxy 127.0.0.1:10808
set http_proxy=http://127.0.0.1:10808
set https_proxy=https://127.0.0.1:10808

3. 按照官方的步骤,下载代码

mkdir webrtc-checkout
cd webrtc-checkout
fetch --nohooks webrtc
gclient sync

4*. 如果gclient sync过程出现异常,或建议最好执行本步骤

gclient runhooks

5. 通过gn生成vs2015的工程

cd src
gn gen --ide=vs2015 /out/Default

结束。

这个过程中比较头疼的问题就是需要一个稳定的代理

2016-11-14 | | chromium, 音视频_图像相关, 音视频容器, 音视频编解码

【chromium、webrtc、gn】引入gn之后下载代码和生成vs工程的方法已关闭评论